同じデータを並行して操作すると、他の処理の途中状態が見える場合があります。分離レベルは可視性と干渉を制御します。強い分離には待機などのコストもあります。
実行順序と分離レベルによる読取り値の比較
1. 状況と分離レベルを選択
状況
分離レベル
2. 時間順に実行
データベース
左がT1、右がT2です。同じ状況で分離レベルを変え、読取り結果を比較してください。
A 原子性全部実行か全部取消
C 一貫性制約を維持
I 分離性干渉を制御
D 永続性確定結果を保持
3種類の読取り異常
Dirty Readは他のトランザクションの未コミット値を読む現象です。ロールバックされると未確定の値を読んだことになります。 Non-repeatable Readは同じ行を再読した際、別トランザクションの更新により値が変わる現象です。 Phantom Readは同じ条件の再検索で、他の挿入により一致する行の集合が変わる現象です。
DBごとの実装の違い
PostgreSQLとOracleの既定はREAD COMMITTED、MySQL InnoDBはREPEATABLE READです。MVCCは過去の版を使い、読取りと書込みの待機を減らします。このシミュレータのSERIALIZABLEはロック方式を表します。
面接でよく聞かれる点
強い分離は同時処理性能を下げる場合があります。ロックの待機やデッドロックにも注意します。在庫更新のような処理では、 SELECT ... FOR UPDATEで対象行を明示的にロックすることもあります。