データベース

トランザクションと分離レベル

同じデータを並行して操作すると、他の処理の途中状態が見える場合があります。分離レベルは可視性と干渉を制御します。強い分離には待機などのコストもあります。

実行順序と分離レベルによる読取り値の比較

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で対象行を明示的にロックすることもあります。