10月5日(火)1、2コマ目
今日、やったこと
トランザクション
今日のホワイトボード
よくあるトランザクションの説明(原子性)
1トランザクションは複数の更新系SQLで構成されるケースが多い。
トランザクション終了時には
- SQLがすべて成功
- SQLはすべてキャンセル
のいずれでなければならない。
これがトランザクションの原子性。
| 図 よくあるトランザクションの説明(トランザクションの原子性) |
コミット、ロールバック
トランザクションの原子性を確保するためにコミット、ロールバックがある。
- コミットは全ての更新を確定する
- ロールバックは全ての更新をキャンセルする
| 図 コミット、ロールバック |
トランザクションの独立性
複数のトランザクションが同時に実行されても、互いに影響を及ぼさないようにトランザクション同士を分離して独立性を確保する。
ただ、トランザクション同士の分離レベルが、全く分離しない(Read Uncommitted)から、ほぼ完ぺきに分離(Serializable)まで4段階ある。
この分離レベルによっては他トランザクションにいろいろな影響(ダーティーリード、ファジーリード、ファントムリード)を及ぼすことがある。
〇ダーティーリード
他トランザクションが更新したがコミットしていないデータを参照してしまう状態。
| 図 ダーティーリード |
多くのデータベースはトランザクション分離レベルがRead Committed。
Read Committedでは、非コミットデータは別トランザクションには見せないようになっている。
| 図 トランザクション分離レベル「Read Committed」 |
〇ファジーリード
他トランザクションが更新することで、同じ行のデータが検索ごとに値が異なる状態。
〇ファントムリード
他トランザクションが更新することで、検索ごとにデータ件数が異なる状態。
ロック
DBは更新時に対象行をロックする。
ロックすれば、他接続からはロックできない。よって、更新ができない。
ロックはコミット、ロールバックで解除される。
| 図 ロック |
手動でロック
ロック対象行を取得するSELECT文にFOR UPDATEをつけて実行すると、ロックができる。
更新時の(DBが実行する)自動ロックではダメな場合に利用。
コミット、ロールバックでロックは解除される。
| 図 手動ロック |
次回は
JavaやC#でトランザクション処理の実装方法についてやります。