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