SQLのトランザクション分離レベルの概要です。
目次
説明 | トランザクションとは |
トランザクション分離レベルとは | |
分離レベル0で発生するダーティリードとは | |
分離レベル1で発生するファジーリードとは | |
分離レベル2で発生するファントムリードとは |
トランザクションとは
- 複数の更新処理を一つの単位として、その単位で処理が全て成功した場合にデータを確定させます。コミット(commit)といいます。
- 複数の更新処理を一つの単位として、その単位で処理が1つでも失敗した場合にすべてのデータを元の状態に戻します。ロールバック(rollback)といいます。
- トランザクションは、「ACID特性」(あしっどとくせい)を持ちます。
- Atomicity(原子性)・・・すべて実行するまたはしない
- Consistency(一貫性)・・・トランザクションの前後でデータは矛盾しない
- Isolation(分離性)・・・トランザクション実行中、他の処理に影響しない
- Durability(永続性)・・・処理結果は保持される
トランザクション分離レベルとは
- 「ACID特性」のうちのI(Isolation)にあたります。
- 複数のトランザクションが同時に実行されたときのデータの整合性を保つ度合いです。
- 数値の高いほうが分離性はあります。
→数値が低いと分離されておらず他に影響があります。 - 分離レベルによって、ダーティリード、ファジーリード、ファントムリードが発生します。
分離レベル | ダーティリード | ファジーリード | ファントムリード |
---|---|---|---|
分離レベル0 READ UNCOMMITTED 未コミットのデータを読む |
発生する | 発生する | 発生する |
分離レベル1 READ COMMITTED コミットのデータを読む |
× | 発生する | 発生する |
分離レベル2 REPEATABLE READ 反復可能な読み込み |
× | × | 発生する |
分離レベル3 SERIALIZABLE シリアル,1つずつ |
× | × | × |
分離レベル0で発生するダーティリードとは
ダーティリードとは、トランザクションが更新して確定していないデータを読み込めてしまうことです。
例
1.ユーザ2が値を100から200にupdateし未コミットの状態とします。
2.ユーザ1は未コミットの値の200を取得します。
3.ユーザ2が値の200をロールバックして100に戻しました。
→ユーザ1は、嘘のデータを取得してしまいます。
分離レベル1で発生するファジーリードとは
ファジーリードとは、取得したデータに対して、別のトランザクションがそのデータを更新して確定た後に、再度データを読み込むと値が変わっていることです。
例
1.ユーザ1が値の100を取得します。
2.ユーザ2は値の100を200にupdateしコミットします。
3.ユーザ1が再度データを読み込むと値は200になっています。
Oracleは、分離レベル1のREAD COMMITTEDを実装しています。
別のトランザクションが更新して確定していないデータは表示されず確定しているデータが表示されます。読み取り一貫性と呼ばれます。
分離レベル2で発生するファントムリードとは
ファントムリードとは、ある条件で取得したデータに対して、別のトランザクションが
データをInsert(delete)して確定した後に、再度同じ条件でデータを読み込むとデータが増えている(減っている)ことです。
例
1.ユーザ1がある条件を指定して行1のデータを取得します。
2.ユーザ2は行2のデータをinsertしてコミットします。
3.ユーザ1が項番1と同じ条件で再度データを読み込むと行1と行2のデータが表示されます。
→再読込すると1行増えている。
→トランザクション1がdeleteした場合は1行減ります。
ファントム(phantom)とは幻という意味です。
関連の記事