10月4日(火)1、2コマ目

今日、やったこと

トランザクション

今日のホワイトボード

トランザクションとは

1件の処理=1トランザクション。

たとえば、送金処理とか在庫更新とかで1つのトランザクション。

1つのトランザクションには複数のSQLを実行するケースが多い。


トランザクションに必要な要件

ACID特性が必要。

  • Atomicity(原子性)
  • Consistency(一貫性)
  • Isolation(独立性)
  • Durability(永続性)


トランザクションの原子性

トランザクション終了時には

  • 全ての更新を実行
  • まったく更新をしていない

のいずれかでなければならない。成功した更新と失敗した更新が存在するのはNG。

図 トランザクション終了時の状態

トランザクションの原子性はコミット、ロールバックで実現。

図 コミット、ロールバック

トランザクションの独立性

トランザクションは単独で実行しても、複数同時に実行しても結果は同じでなければならない。
図 複数トランザクションが同時に実行されると

そのために、トランザクション同士を分離、独立させて実行し、互いに影響が及ばないようにする。
このトランザクションの分離レベルが全く分離しない(Read Uncommitted)からほぼ完ぺきに分離する(Serializable)まで4段階ある。
この分離レベルに応じて、他トランザクションにいろいろな影響(ダーティーリード、ファジーリード、ファントムリード)が発生する。

ダーティーリード

他トランザクションで、更新したがコミットしていないデータを参照してしまうこと。

図 ダーティーリード
多くのDBの分離レベルはRead Committedなので、ダーティーリードは発生しない。
Read Committedなら、非コミットデータは参照しない。

ファジーリード

同じデータを参照しても、他トランザクションが更新することで、毎回異なるデータを参照すること。
分離レベルがRead Committedなら、コミットしたデータは参照できるため、ファジーリードが発生する。


ファントムリード

他トランザクションが追加、削除することで、参照するたびに出力行数が異なること。

分離レベルがRead Committedなら、コミットしたデータは参照できるため、ファントムリードが発生する。


ロック

DB更新時には更新対象行をロックして、他から更新できないようにする。

ロック中データを更新するにはロックが解除されるまで待機する(ロック解除待ち)。

図 ロック

ロックはコミットまたはロールバック実行で解除される。

手動ロック

複数行をまとめてロックしたい場合に利用。
select文に for updateをつけて実行すれば、検索対象行がロックされる。
図 手動ロック
手動ロックもコミットまたはロールバック実行で解除される。


次回は

Javaや.Netでトランザクションを実装します。