トランザクション分離レベルってREAD UNCOMMITTED、READ COMMITTED、REPEATABLE READ、SERIALIZABLEあたりは知っていたが実はそれ以外にも仕様があるらしい。ちなみに現場で使ったのはREAD COMMITTED、REPEATABLE READぐらい(ポスグレとMySQLのデフォルトとトランザクションあたりのクエリが少ない場合のMySQL)だった。
知らないのは「Monotonic View」「Snapshot Reads」「Cursor Stability」「Snapshot Isolation」の4つ。最初の3つはそれぞれREAD COMMITTEDの拡張になるらしい。
MySQLのRepeatable ReadはSnapshot Isolationじゃないのか
Snapshot isolation は snapshot reads と repeatable read を拡張し、トランザクションに含まれる全ての読み取り操作でデータベースの一貫性のあるスナップショットを読み取ることを保証しています。あるトランザクションに含まれる読み取り操作はそれがトランザクション内の最初の方で実行されようが最後の方で実行されようが常に同じ結果を得ることになります。
上記した記事を引用するとこのように書かれている。MySQLはRepeatableReadを使っていればスナップショットを用いた分離を実現していてそれを満たしているように見えた。ただそはあくまでも参照におけるConsistent Nonlocking Readsだけの話であってlost updateは発生しうるので満たせないようであった。
TiDBは?
Snapshot Isolationをサポートしていると書いてあった。コミット時に、トランザクションの開始後に行が別のトランザクションによって更新されたことをチェックして実現しているらしい。