在 Twitter 上看到這則推,講到在 SQL-92 裡面 Isolation Level 定義的背景:
.@halberenson sent me an amazing email last year about why the ANSI SQL isolation levels got muddied up. I'm sure he can share more details about what happened. pic.twitter.com/Z4iWD4siPg
— Andy Pavlo (@andy_pavlo) June 12, 2020
先是講了為什麼有 SERIALIZABLE
、REPEATABLE READ
與 READ COMMITTED
,然後講為什麼是用 anomalies 定義 (除了 SERIALIZABLE
),也因此造成了定義不清楚而導致問題。
SQL-92 的 isolation 問題後來在其他文件裡面有被討論,像是 1995 年的「A Critique of ANSI SQL Isolation Levels」,以及 2000 年的論文「Generalized Isolation Level Definitions」,過了二十年後的現在,大家也都大概知道有哪些雷區了。
另外講到 Isolation Level,實務上會希望知道 database 與標準之間的差異,在「Hermitage: Testing transaction isolation levels」這篇可以看到各家 RDBMS 在不同設定下實際的 isolation level,包括了 open source 的 MySQL 與 PostgreSQL 與商用常遇到的 Oracle 與 Microsoft SQL Server。
MySQL 的 REPEATABLE READ
因為 SQL-92 的定義不清楚,所以大概知道這邊本來就有爭議,比較意外的反倒是 Oracle 裡面的 SERIALIZABLE
實際上是 Snapshot Isolation,沒有辦法達到 SQL-92 裡面最高等級的 Isolation Level。
然後發現有些知識還是有漏,趁這個機會補...