brb teaが言うように、データベースの実装とそれらが使用するアルゴリズム(MVCCまたは2フェーズロック)によって異なります。
CUBRID(オープンソースRDBMS)は、この2つのアルゴリズムの考え方を説明しています。
1つ目は、T2トランザクションがAレコードを変更しようとしたときに、T1トランザクションがすでにAレコードを変更したことを認識しており、T2トランザクションがT1トランザクションがコミットされるかロールされるかを認識できないため、T1トランザクションが完了するまで待機します。バック。この方法は2フェーズロック(2PL)と呼ばれます。
もう1つは、T1およびT2トランザクションのそれぞれが独自のバージョンを変更できるようにすることです。T1トランザクションがAレコードを1から2に変更した場合でも、T1トランザクションは元の値を1のままにし、AレコードのT1トランザクションバージョンが2であると書き込みます。次に、次のT2トランザクションはAレコードを変更します1から3、2から4ではなく、AレコードのT2トランザクションバージョンが3であると書き込みます。
T1トランザクションがロールバックされるとき、T1トランザクションバージョン2がAレコードに適用されていなくても問題ありません。その後、T2トランザクションがコミットされると、T2トランザクションバージョン3がAレコードに適用されます。T2トランザクションの前にT1トランザクションがコミットされると、T2トランザクションのコミット時にAレコードが2に変更され、次に3に変更されます。最終的なデータベースのステータスは、他のトランザクションに影響を与えることなく、各トランザクションを個別に実行するステータスと同じです。したがって、ACIDプロパティを満たします。この方法は、マルチバージョン同時実行制御(MVCC)と呼ばれます。
MVCCは、メモリ内のオーバーヘッドの増加(同じデータの異なるバージョンを維持する必要があるため)と計算(REPETEABLE_READレベルでは更新を失うことができないため、Hiberateなどのデータのバージョンをチェックする必要がある)を犠牲にして、同時変更を許可しますとする Optimistickロック)。
2PL トランザクション分離レベルでは、以下を制御します。
トランザクション分離レベルを選択しても、データ変更を保護するために取得されるロックには影響しません。トランザクションは、変更するすべてのデータに対して排他ロックを取得し、トランザクションに設定された分離レベルに関係なく、トランザクションが完了するまでそのロックを保持します。読み取り操作の場合、トランザクション分離レベルは主に、他のトランザクションによって行われた変更の影響からの保護レベルを定義します。
分離レベルを低くすると、多くのユーザーが同時にデータにアクセスできるようになりますが、同時実行効果の数は増えます。ようになりますが、ユーザーが遭遇する可能性のあるダーティリードや更新の喪失などます。
SQL Serverでのロックと分離レベルの関係の具体例(READ_COMMITTED_SNAPSHOT = ONを指定したREAD_COMMITEDを除く2PLを使用)
READ_UNCOMMITED:他のトランザクションが現在のトランザクションによって読み取られたデータを変更するのを防ぐために、共有ロックを発行しないでください。READ UNCOMMITTEDトランザクションは、現在のトランザクションが変更されたが他のトランザクションによってコミットされていない行を読み取ることを妨げる排他ロックによってもブロックされません。[...]
READ_COMMITED:
- READ_COMMITTED_SNAPSHOTがOFF(デフォルト)に設定されている場合:共有ロックを使用して、現在のトランザクションが読み取り操作を実行している間、他のトランザクションが行を変更しないようにします。共有ロックは、他のトランザクションが完了するまで、他のトランザクションによって変更された行をステートメントが読み取ることもブロックします。[...]次の行が処理される前に行ロックが解放されます。[...]
- READ_COMMITTED_SNAPSHOTがONに設定されている場合、データベースエンジンは行のバージョン管理を使用して、ステートメントの開始時に存在していたトランザクションのデータのスナップショットを各ステートメントに提示します。ロックは、他のトランザクションによる更新からデータを保護するためには使用されません。
REPETEABLE_READ:トランザクション内の各ステートメントによって読み取られたすべてのデータに共有ロックが設定され、トランザクションが完了するまで保持されます。
SERIALIZABLE:範囲ロックは、トランザクションで実行される各ステートメントの検索条件に一致するキー値の範囲に配置されます。[...]範囲ロックは、トランザクションが完了するまで保持されます。