10月4日(火)1、2コマ目
今日、やったこと
トランザクション
今日のホワイトボード
トランザクションとは
1件の処理=1トランザクション。
たとえば、送金処理とか在庫更新とかで1つのトランザクション。
1つのトランザクションには複数のSQLを実行するケースが多い。
トランザクションに必要な要件
ACID特性が必要。
- Atomicity(原子性)
- Consistency(一貫性)
- Isolation(独立性)
- Durability(永続性)
トランザクションの原子性
トランザクション終了時には
- 全ての更新を実行
- まったく更新をしていない
のいずれかでなければならない。成功した更新と失敗した更新が存在するのはNG。
![]() |
| 図 トランザクション終了時の状態 |
トランザクションの原子性はコミット、ロールバックで実現。
![]() |
| 図 コミット、ロールバック |
トランザクションの独立性
トランザクションは単独で実行しても、複数同時に実行しても結果は同じでなければならない。
![]() |
| 図 複数トランザクションが同時に実行されると |
そのために、トランザクション同士を分離、独立させて実行し、互いに影響が及ばないようにする。
このトランザクションの分離レベルが全く分離しない(Read Uncommitted)からほぼ完ぺきに分離する(Serializable)まで4段階ある。
この分離レベルに応じて、他トランザクションにいろいろな影響(ダーティーリード、ファジーリード、ファントムリード)が発生する。
ダーティーリード
他トランザクションで、更新したがコミットしていないデータを参照してしまうこと。
![]() |
| 図 ダーティーリード |
Read Committedなら、非コミットデータは参照しない。
ファジーリード
同じデータを参照しても、他トランザクションが更新することで、毎回異なるデータを参照すること。
分離レベルがRead Committedなら、コミットしたデータは参照できるため、ファジーリードが発生する。
ロックはコミットまたはロールバック実行で解除される。
ファントムリード
他トランザクションが追加、削除することで、参照するたびに出力行数が異なること。
分離レベルがRead Committedなら、コミットしたデータは参照できるため、ファントムリードが発生する。
ロック
DB更新時には更新対象行をロックして、他から更新できないようにする。
ロック中データを更新するにはロックが解除されるまで待機する(ロック解除待ち)。
![]() |
| 図 ロック |
ロックはコミットまたはロールバック実行で解除される。
手動ロック
複数行をまとめてロックしたい場合に利用。
select文に for updateをつけて実行すれば、検索対象行がロックされる。
![]() |
| 図 手動ロック |
手動ロックもコミットまたはロールバック実行で解除される。
次回は
Javaや.Netでトランザクションを実装します。





