Transaction Issues
データベーストランザクションが並行 実行 される際 に発生 しうる問題 。これらの問題 は異 なる分離 レベルによって防止 できる。
Dirty Read
ダーティリード
あるトランザクションが、まだコミットされていない(un-commit)別
のトランザクションのデータを読
み取
ること。そのトランザクションが最終的
にロールバックされた場合
、読
み取
ったデータは不正確
となる。
MySQL Demo
| Time | Transaction A | Transaction B |
|---|---|---|
| T0 | SET SESSION TRANSACTION ISOLATION LEVEL READ UNCOMMITTED; | SET SESSION TRANSACTION ISOLATION LEVEL READ UNCOMMITTED; |
| T1 | BEGIN; | BEGIN; |
| T2 | UPDATE employees SET salary = 600000.00 WHERE id = 1; | |
| T3 | SELECT * FROM employees WHERE id = 1; — トランザクション A の未
コミット変更
を読
み取
る | |
| T4 | COMMIT; |
Phantom Read
ファントムリード
あるトランザクション内
で同
じクエリを複数回
実行
した際
、他
のトランザクションがクエリ条件
に該当
する行
を挿入
、更新
、または削除
したことにより、毎回
異
なる結果
が返
されること。
詳細 な例 は参照 :Gap Lock によるファントムリード防止
Non-Repeatable Read
反復不能読み取り
あるトランザクション内
で同
じデータを複数回
読
み取
った際
、別
のトランザクションの更新
によりデータの値
が変化
すること。
MySQL Demo
| Time | Transaction A | Transaction B |
|---|---|---|
| T0 | SET SESSION TRANSACTION ISOLATION LEVEL READ COMMITTED; | SET SESSION TRANSACTION ISOLATION LEVEL READ COMMITTED; |
| T1 | BEGIN; | BEGIN; |
| T2 | SELECT * FROM employees WHERE id = 1; — 最初
の読
み取
り | |
| T3 | UPDATE employees SET salary = 6666.00 WHERE id = 1; | |
| T4 | COMMIT; | |
| T5 | SELECT * FROM employees WHERE id = 1; — 再度
読
み取
り、データが変
わっている | |
| T6 | COMMIT; |