SQL トランザクションとは

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

関連の記事

Oracle select for updateのサンプル

△上に戻る