データベース・トランザクションの4つの独立性レベル


データベースには、次の4つの独立性レベルが定義されています.
  • Read Uncommitted( )
  • Read Committed( )
  • Repeatable Read( )
  • Serializable( )

  • この4つの独立性は順次上昇し、独立性レベルが低いほど、システムのオーバーヘッドが小さくなり、同時サポート性が高くなります.
    コマンドshow variables like '%isolation%';を使用して、現在のデータベースで使用されている独立性レベルを表示します.
    4つの独立性レベルを説明する前に、トランザクションを使用するときに発生する3つの特殊な(ほとんどの場合エラーになる)読み取りタイプについて説明します.
  • ダーティリードとは、1つのトランザクションaが1つのデータを修正または追加し、aトランザクションがコミットされる前に別のトランザクションbがこのデータを読み取り、操作することを意味する.aロールバックすると、汚れた読み取りによりb操作に存在しないデータが発生する可能性がある.
  • は、1つのトランザクションの同じ条件のクエリが2回一致しない.例えば、aトランザクションがselect count(*) from user where name='alex'を実行すると、トランザクションbがデータname=alexを挿入してコミットされ、トランザクションaが2回目のクエリを行うときに1つのカウント
  • が増加する.
  • 幻読みは繰り返し不可とは逆に、トランザクションaとトランザクションbは完全に隔離され、トランザクションaが'select id from userを実行するidは1と2である.このとき、bトランザクションはuserテーブルにデータid=3を追加してコミットし、トランザクションaはidが3のデータを追加したいと考えています.idが一意である場合、aは挿入できないことを発見し、dumplicate entry 3 for key idを提示します.これは、トランザクションaがトランザクションbの挿入行為を阻止するためです.

  • 繰り返し読みと幻読みを混同しないように注意
    Read Uncommited
  • RUモードでは、トランザクションにcommitがない場合でも、他のトランザクションでコミットされていないデータを読み込むことができます.
  • RUは、すべての独立性レベルの中で最も低いものです.RUモードはダーティリード
  • を引き起こす
    Read Commited
  • RCモードでは、トランザクションはcommit済みのデータしか読み込めません.
  • 例えば、トランザクションaが実行されている場合、トランザクションbがコミットされていない場合、aはbのデータを読めない.bがaをコミットすれば、bが修正したデータが読めます.
  • RCは汚れた読み取りを避けることができますが、重複しない読み取りを招きます.
  • の大部分のシステムはRCモード
  • を使用する
    Repeatable
  • RRモードでは、トランザクションの複数回のReadは、コミットの有無にかかわらず、他のトランザクションの影響を受けません.
  • は、RRモードでトランザクションaが作成されたときに現在の時刻データのスナップショットを取得し、スナップショットが残りのトランザクションの影響を受けないことを理解することができる.
  • RRモードでは、残りのトランザクションが認識されないため、重複した挿入を引き起こす可能性があります.
  • mysql innoDBのRRモードはある程度幻読を避けることができ,この特性は (gap lock)によって実現され,ギャップロックの原理はこの文章を参照することができる.http://www.jianshu.com/p/bf86...

  • Serializable
  • はシリアル化され、その名の通り、すべての読み書き操作を完全にシリアル化しています.
  • シリアル化は、すべての独立性レベルの中で最も高い
  • です.
  • は、読むたびにテーブルレベルの共有ロックを取得する必要があり、読み書きは互いに
  • をブロックする.
  • シリアル化はリソースに対するオーバーヘッドが大きく、同時サポートにはよくなく、一部のシーンでのみ使用されます.

  • 最後に、3つのリード・タイプに対する4つの独立性レベルの対照表を示します.
    独立性レベル
    汚読
    繰り返し不可
    まぼろし読み
    Read Uncommited
    かもしれない
    かもしれない
    かもしれない
    Read Commited
    あり得ない
    かもしれない
    かもしれない
    Repeatable Read
    あり得ない
    あり得ない
    かもしれない
    Serializable
    あり得ない
    あり得ない
    あり得ない