SQL トランザクション分離レベルの概要

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)とは幻という意味です。

関連の記事

SQL select for updateのサンプル

△上に戻る