DB 管理システム (DBMS) のトランザクション
定義:
データベース管理システム (DBMS) の トランザクション は、単一の論理的な作業単位として実行される一連の操作です。トランザクションには、データベース内のデータの読み取り、挿入、更新、または削除が含まれる場合があります。トランザクションの主な特徴は、トランザクションがアトミックであることです。これは、トランザクション内のすべての操作が正常に完了するか、データベースにまったく適用されないことを意味します。
トランザクションの主要なプロパティ: ACID プロパティ
トランザクションは、データベースの一貫性と信頼性を確保するために、ACID プロパティに準拠する必要があります。これらのプロパティは次のとおりです:
-
原子性:
- アトミック性により、トランザクションが単一の分割不可能な作業単位として扱われることが保証されます。トランザクション内のすべての操作が実行されるか、何も実行されないかのどちらかです。トランザクションの一部が失敗した場合、トランザクション全体がロールバックされ、データベースが一貫した状態に保たれます。
-
例: トランザクションにアカウント A からアカウント B への送金が含まれる場合、アトミック性により、送金全体が完了する (A からお金が差し引かれ、B に追加される) か、何も行われない (お金は送金されない) ことが保証されます。失敗した場合)。
-
一貫性:
- 一貫性により、トランザクションによってデータベースがある有効な状態から別の有効な状態に移行することが保証されます。どのトランザクションもデータベースの整合性制約 (主キー、外部キーなど) に違反してはなりません。トランザクションがコミットされた後は、データベースは常に一貫した状態になる必要があります。
-
例: 2 つの銀行口座間で送金した後、両方の口座の残高の合計は一定のままである必要があります。データベースの整合性ルールに違反すると、トランザクションはロールバックされます。
-
隔離:
- 分離により、トランザクションの実行中にトランザクションの操作が他のトランザクションから確実に隠蔽されます。複数のトランザクションが同時に発生している場合でも、各トランザクションは他のトランザクションの操作を認識すべきではありません。これにより、ダーティ リード、非反復読み取り、ファントム リードが防止されます。
-
例: 2 人のユーザーが同じ銀行口座から同時に送金している場合、分離により一方の取引が他方の取引に干渉しないことが保証され、二重引き出しなどのエラーが防止されます。
-
耐久性:
- 耐久性により、トランザクションがコミットされると、システムがクラッシュした場合でも、その変更は永続的に保たれることが保証されます。コミットが成功すると、トランザクションによって行われた変更はデータベースに保存され、失われることはありません。
-
例: ユーザーが注文に成功した場合、コミット直後に突然の停電が発生した場合でも、データベースの変更 (在庫の更新や発注など) は維持されるはずです。
取引の種類
-
単純なトランザクション:
- これらには、データの読み取りまたは書き込みなどの単一の操作が含まれます。たとえば、単純な読み取りクエリや更新クエリはトランザクションの一部である可能性があります。
-
複雑なトランザクション:
- これらには、読み取り、更新、挿入、削除などの複数の操作が含まれます。複雑なトランザクションとは、ある口座から別の口座への送金など、ビジネス プロセスを完了するために設計された一連の操作のことです。これには、口座残高の確認、一方からの引き落とし、もう一方への追加が含まれます。
トランザクションのライフサイクル
一般的なトランザクションは次の手順に従います:
-
トランザクションの開始:
- これはトランザクションの開始を示します。これは、新しいトランザクションが実行されようとしていることを示します。
-
操作の実行:
- トランザクションは、レコードの選択、挿入、更新、削除などの一連のデータベース操作を実行します。これらの操作は、トランザクションの一部として順次実行されます。
-
トランザクションのコミット:
- すべての操作が完了すると、トランザクションがコミットされます。これは、トランザクションによって行われたすべての変更がデータベースに永続的に保存されることを意味します。一度コミットされたトランザクションはロールバックできません。
-
ロールバックトランザクション:
- トランザクションの実行中にエラーまたは障害 (制約違反など) が発生した場合、トランザクションはロールバックされます。これは、トランザクションによって行われたすべての変更が元に戻され、データベースが元の状態に戻ることを意味します。
-
トランザクションの終了:
- コミットまたはロールバックの後、トランザクションは終了します。これは、トランザクションのライフサイクルが完了したことを示します。
トランザクション状態
トランザクションは、ライフサイクル中、次のいずれかの状態にある必要があります:
-
アクティブ:
- トランザクションの初期状態。トランザクションは、操作の実行中、この状態に留まります。
-
部分的にコミット済み:
- この状態は、トランザクションの最後のステートメントが実行された後に発生します。この時点で、トランザクションはすべての操作を終了しましたが、まだデータベースにコミットされていません。
-
失敗:
- 通常、制約違反やシステム障害などの問題により、通常の実行が続行できないことが判明した場合、トランザクションは 失敗 状態に入ります。
-
中止されました:
- トランザクションがロールバックされ、データベースがトランザクション開始前の状態に復元されると、データベースは aborted 状態に入ります。
-
コミット済み:
- すべての操作が正常に完了し、その変更がデータベースに永続的に適用されると、トランザクションは コミット済み 状態になります。
-
終了:
- トランザクションは、コミットまたは中止された場合、終了とみなされます。トランザクションがコミットまたは中止された状態に達すると、再開することはできません。
DBMSのスケジュール
スケジュールは、特定の順序で実行される複数のトランザクションからの一連の操作です。スケジュールは、複数のトランザクションの読み取りおよび書き込み操作の実行順序を決定します。主な目的は、同時トランザクションがどのように相互作用するかを判断し、データベースが一貫した状態に保たれるようにすることです。
スケジュールは シリアル または 非シリアル にすることができます。
スケジュールの種類
-
連載スケジュール:
- シリアル スケジュールとは、トランザクションがインターリーブなしで次々に実行されるスケジュールです。これは、1 つのトランザクションの操作が次のトランザクションが開始される前に完全に完了することを意味します。
- シリアルスケジュールでは同時実行性はなく、スケジュールはトランザクションを順番に実行することと同等です。
シリアルスケジュールの例:
- トランザクション 1: T1: Read(A);書き込み(A);専念
- トランザクション 2: T2: Read(B);書き込み(B);専念
- トランザクションは次々に実行され、操作に重複はありません。
-
非連続スケジュール:
- 非シリアルスケジュールでは、複数のトランザクションからの操作をインターリーブすることができます。このタイプのスケジュールでは、トランザクションは同時に実行されます。つまり、トランザクションの操作が混在します。
- 非シリアル スケジュールは、操作の実行順序に応じて異なる結果を引き起こす可能性があるため、ACID プロパティを維持するには慎重な管理が必要です。
非連続スケジュールの例:
- T1: 読み取り(A);書き込み(A);
- T2: 読み取り(B);書き込み(B);
- T1: コミット;
- T2: コミット;
- トランザクション T1 と T2 の操作はインターリーブされます。
直列化可能性
直列化可能性 は、複数のトランザクションを同時に実行した結果が、トランザクションが逐次的に (次々に) 実行された場合と同じであることを保証する概念です。データベースへの影響という点でシリアル スケジュールと同等である場合、スケジュールはシリアル化可能であると言われます。
重要性:
シリアル化可能性の目標は、同時トランザクションによって競合や異常 (ダーティ リード、更新の喪失など) が発生せず、データベースが一貫した状態に保たれるようにすることです。
シリアル化可能性には主に 2 つのタイプがあります:
-
シリアル化可能性の競合:
- スケジュールは、競合しない操作を交換することによってシリアル スケジュールに変換できる場合、競合シリアル化可能です。 2 つの操作は、異なるトランザクションからのもので、同じデータ項目にアクセスし、少なくとも 1 つが書き込み操作である場合、競合しているとみなされます。
-
競合操作:
-
読み取り/書き込み競合は、あるトランザクションが別のトランザクションが書き込むデータ項目を読み取るときに発生します。
-
書き込み-書き込み競合は、2 つのトランザクションが両方とも同じデータ項目に書き込む場合に発生します。
競合の直列化可能性の例:
- スケジュール:
- T1: Write(A);
- T2: Write(B);
- T1: 読み取り(B);
- T2: Read(A);
- このスケジュールはシリアルスケジュールに再配置でき、競合シリアル化可能です。
-
シリアル化可能性を表示:
- 最終結果の点でスケジュールがシリアル スケジュールと同等である場合、つまり、同じ読み取りと書き込みが発生し、トランザクションが正しくシリアル化されている場合、スケジュールはビュー シリアル化可能です。ただし、ビューの直列化可能性では、競合する直列化可能性のように操作を必ずしも交換する必要はありません。
同等の競合、シリアル化可能な競合
-
同等の競合:
- 2 つのスケジュールは、同じ操作が含まれ、操作の順序が同じで、競合する操作の順序が保持される場合、競合同等 であると言われます。これは、両方のスケジュールでトランザクションをインターリーブすると同じ結果が生成され、競合が同等であることが保証されることを意味します。
-
シリアル化可能な競合:
- スケジュールは、トランザクションを再配置して競合順序を維持しながらシリアルスケジュールを形成できる場合、競合シリアル化可能です。簡単に言うと、データの一貫性を損なうことなくトランザクションをシリアル化できる場合、つまり、競合する操作の順序を維持できる場合、スケジュールは競合シリアル化可能です。
競合のシリアル化可能性と競合と同等のスケジュールの例
次のトランザクションとその操作を考えてみましょう:
- トランザクション T1: Read(A);書き込み(A);専念
- トランザクション T2: Read(A);書き込み(A);専念
スケジュール 1:
T1: Read(A);
T2: Read(A);
T1: Write(A);
T2: Write(A);
T1: Commit;
T2: Commit;
スケジュール 2:
T2: Read(A);
T1: Read(A);
T2: Write(A);
T1: Write(A);
T1: Commit;
T2: Commit;
競合シリアル化可能性チェック:
-
スケジュール 1 と スケジュール 2 は、競合する操作 (A の読み取り/書き込み) の順序が維持されるため、競合同等 です。どちらのスケジュールもシリアル スケジュールに変換できます。
- T1: 読み取り(A);書き込み(A);コミット;
- T2: 読み取り(A);書き込み(A);コミット;
- したがって、両方のスケジュールは 競合シリアル化可能です。
トランザクションの分離と原子性
ACID プロパティなどのトランザクションの基本的なプロパティに加えて、トランザクションの失敗の管理は、データベースの一貫性と信頼性を維持するための重要な側面です。トランザクションが同時に実行される場合、データベースは、トランザクション中の障害によってデータベースの状態が破壊されず、データベースの原子性と一貫性が維持されることを保証する必要があります。このセクションでは、障害処理が DBMS のトランザクション分離とアトミック性にどのような影響を与えるかについて説明します。
アトミック性と障害処理
原子性 は、トランザクションが単一の分割不可能な作業単位として扱われることを保証するトランザクションのプロパティです。これは、トランザクションが完全に完了したか、まったく実行されなかったことを意味します。トランザクションの一部が失敗した場合は、部分的な変更がデータベースに適用されないように、トランザクション全体をロールバックする必要があります。
トランザクションが失敗した場合、データベースに与えた影響をすべて元に戻して、データベースをトランザクション開始前の状態に戻す必要があります。トランザクションの同時実行が可能なシステムでは、トランザクション T1 が失敗した場合、データベースのアトミック性を維持するために、T1 に依存するすべてのトランザクション (つまり、T1 の影響を受けるデータの読み取りまたは書き込みを持つトランザクション T2) も中止する必要があります。トランザクションが失敗した別のトランザクションに依存している場合、部分的な変更や不整合なデータを残すべきではありません。
トランザクション実行中の不一致を防ぐには、特にトランザクションが失敗した場合に、トランザクション操作の順序を決定するスケジュールを管理することが重要です。障害を適切に管理できるように、特定の種類のスケジュールを制限する必要があります。
回復可能なスケジュール
回復可能なスケジュールは、トランザクション T2 が依存するトランザクション T1 がコミットされた後でのみコミットするスケジュールです。より簡単に言うと、トランザクション T2 がトランザクション T1 によって書き込まれたデータを読み取る場合、T2 が行う前に T1 がコミットする必要があります。これにより、T2 がコミットされていないトランザクションに基づいて変更をコミットしないことが保証され、T1 のロールバックで T2 のロールバックも必要になるというシナリオが回避されます。
このルールに違反するスケジュールは、回復不可能なスケジュールと呼ばれます。たとえば、T1 によって書き込まれたデータを読み取った後に T2 がコミットしたが、T1 が失敗してロールバックされた場合、T2 のコミットは T1 のコミットされていない変更に依存しているため、データベースは一貫した状態に回復できません。この状況では、T2 を元に戻すことができなくなり、データの不整合が発生します。
回復不可能なスケジュールの例:
回復不可能なスケジュールでは、次のようにしましょう:
- トランザクション T6 は項目 A にデータを書き込みます。
- トランザクション T7 は、T6 によって書き込まれた A の値を読み取り、すぐにコミットします。
T6 がコミットする前に失敗した場合、T7 は T6 によって行われたコミットされていない変更に依存します。 T7 はすでにコミットしているため、T7 をロールバックすることができず、T6 の障害から回復できない状況が発生します。これにより、回復不能なスケジュールが発生します。
スケジュールを回復可能にするには、T7 が T6 のコミット後までコミットを遅らせ、T7 が T6 からのコミットされていないデータに依存しないようにする必要があります。
カスケードレススケジュール
スケジュールが回復可能であっても、特にカスケード ロールバックが発生した場合、トランザクション障害の回復中に問題が発生する可能性があります。 カスケード ロールバック とは、1 つのトランザクションの失敗が他の依存トランザクションのロールバックの連鎖反応を引き起こす状況を指します。この状況は、コミットされていない別のトランザクションによって書き込まれたデータをトランザクションが読み取るときに発生します。
たとえば、次のようなシナリオを考えてみましょう。
- トランザクション T8 はデータ項目 A に値を書き込み、トランザクション T9 によって読み取られます。
- トランザクション T9 は A に値を書き込み、その値はトランザクション T10 によって読み取られます。
- T8 が失敗した場合、T8 に依存する T9 もロールバックする必要があります。 T9 に依存する T10 もロールバックする必要があります。これにより、カスケード ロールバック効果が生じ、複数のトランザクションの作業が不必要に元に戻されます。
カスケード ロールバックは、たとえ 1 つのトランザクションが失敗しただけであっても、大量の作業を元に戻すことになるため、望ましくありません。カスケードロールバックを防ぐために、カスケードレススケジュールを使用できます。カスケードレス スケジュールとは、まだコミットされていないトランザクションによって書き込まれたデータをトランザクションが読み取らないスケジュールです。
正式には、カスケードレス スケジュールとは、任意の 2 つのトランザクション T1 および T2 で、T1 によって書き込まれたデータ項目を T2 が読み取る場合、T2 がデータ項目を読み取る前に T1 がコミットされている必要があるスケジュールです。これにより、トランザクションがコミットされていないデータに依存することがなくなり、カスケード ロールバックが発生しなくなります。
すべてのカスケードレス スケジュールは、回復可能なスケジュールでもあります。つまり、カスケードレス スケジュールは、カスケード ロールバックを防ぐだけでなく、トランザクション障害が発生した場合でもデータベースが正しく回復できることを保証します。
カスケードレス スケジュールの例:
次の点を考慮してください:
- トランザクション T8 は A を書き込み、T9 は A を読み取ります。
- カスケードレス スケジュールでは、T9 は T8 がコミットした後にのみ A を読み取ることができます。
これにより、T8 が正常に完了しない限り、T9 が T8 からデータを読み取らないことが保証され、T8 が失敗した場合でも T9 をロールバックする必要がなくなります。
トランザクション分離レベル
トランザクション分離は、同時トランザクションがデータベースの整合性を侵害する形で相互に干渉しないようにします。トランザクションの分離レベルは、トランザクションが他のトランザクションから分離される程度を定義します。
低絶縁から高絶縁まで、さまざまな 絶縁レベルがあります。
-
コミットされていない読み取り:
- この分離レベルにより、トランザクションは他のコミットされていないトランザクションによって書き込まれたデータを読み取ることができます。このレベルでは、トランザクションが後でロールバックされる可能性のあるデータを読み取るダーティ リードなどの問題が発生し、一貫性のない結果が生じる可能性があります。
-
コミットされた読み取り:
- このレベルのトランザクションは、他のトランザクションによってコミットされたデータのみを読み取ることができます。これによりダーティ リードは防止されますが、反復不可能な読み取りが発生する可能性があります。つまり、トランザクションが同じデータを 2 回読み取り、その間に別のトランザクションがデータを変更したために異なる結果が得られることになります。
-
反復読み取り:
- このレベルは、ダーティ読み取りと非反復読み取りの両方を防止します。ただし、ファントム読み取りは引き続き許可されます。この場合、他のトランザクションがレコードを挿入または削除すると、トランザクションは異なる行セットに遭遇する可能性があります。
-
シリアル化可能:
- これは最高の分離レベルです。これにより、同時トランザクションの結果が、トランザクションが次々と直列に実行された場合と同じになることが保証されます。これにより、ダーティ読み取り、反復不能読み取り、ファントム読み取りが防止されますが、その厳密な性質によりパフォーマンスに影響を与える可能性があります。
データベースまたはトランザクションに対して選択された分離レベルは、データの整合性とパフォーマンスのバランスに影響します。一般に、分離レベルが高くなると同時実行性の制限が大きくなるため、パフォーマンスが低下します。
DBMS の同時実行制御
同時実行制御は、複数のトランザクションの同時実行を可能にしながら、正しいトランザクションの実行を保証するデータベース管理システム (DBMS) の重要な側面です。同時実行制御の目標は、トランザクションのインターリーブや障害のシナリオに直面しても、データベースの一貫性と整合性を維持することです。このセクションでは、さまざまなロック モード、2 フェーズ ロック プロトコル、デッドロック処理 メカニズム、および タイムスタンプ ベースのプロトコルを含む、ロックベースのプロトコルについて説明します。 .
ロックベースのプロトコル
ロックは、同時に実行されるトランザクション間の競合を防ぐために DBMS で使用される基本的なメカニズムです。ロックはデータ項目に適用されてアクセスを制御し、複数のトランザクションがデータベースの整合性を侵害しないようにします。ロックベースの同時実行制御では、トランザクションはデータ項目に対して操作を実行する前にそのロックを取得し、操作が完了するとロックを解放します。
ロックの種類
データ項目をロックできるさまざまなモードがあります。このセクションでは、次の 2 つの基本モードに注目します:
-
共有ロック (S):
- トランザクションは、項目の読み取りのみが必要な場合に、データ項目の共有ロックを保持します。
- 複数のトランザクションは、同じデータ項目に対して同時に共有ロックを保持できます。これにより、異なるトランザクションによるデータ項目の同時読み取りが可能になります。
-
共有ロックでは、トランザクションによるデータ項目の変更は許可されません。
例:
- トランザクション T1 はアイテム A の共有ロックを保持し、A を読み取ります。
- トランザクション T2 は項目 A の共有ロックを保持し、A を読み取ります。
- どちらもデータを読み取ることはできますが、A に書き込むことはできません。
-
排他ロック (X):
- トランザクションは、データ項目の読み取りと書き込みの両方が必要な場合、そのデータ項目に対して排他的ロックを保持します。
- 特定のデータ項目に対して排他ロックを保持できるトランザクションは常に 1 つだけです。トランザクションに排他ロックがある場合、他のトランザクションは同じデータ項目の共有ロックまたは排他ロックを取得できません。
例:
- トランザクション T1 は項目 A の排他ロックを保持し、それに書き込みます。
- T1 が A の排他ロックを保持している間、他のトランザクションは A に対して読み書きできません。
ロックの付与
ロックは、システムが従うプロトコルに基づいて付与され、さまざまなロックベースのプロトコルによって、トランザクションの実行中にロックが要求および付与される方法を制御できます。これらのプロトコルは、更新の喪失、一時的な不整合、他のトランザクションによるアクセス中のコミットされていないデータなどの競合を回避するのに役立ちます。
2 フェーズ ロック プロトコル (2PL)
2 フェーズ ロック プロトコル は、直列化可能性 を確保するために広く使用されているプロトコルです。これは、トランザクションの結果が 1 回後に実行した場合と同等になるような方法でトランザクションが実行されることを保証するプロパティです。別のもの(シリアル)。 2 フェーズ ロックは、トランザクションの実行中に 2 つのフェーズを強制することでシリアル化可能性を保証します。
-
成長期:
- このフェーズでは、トランザクションはロックを取得できますが、ロックを解放することはできません。
- トランザクションは任意の数のロックを要求できますが、一度ロックを解放すると、新しいロックを取得できなくなります。このフェーズは、最初のロック解除操作が実行されると終了します。
-
縮小フェーズ:
- このフェーズでは、トランザクションはロックを解放できますが、新しいロックを取得できません。
- トランザクションがロックの解放を開始すると、追加のデータ項目をロックできなくなります。このフェーズは、トランザクションがコミットまたは中止されると終了します。
2 フェーズ ロック プロトコルは、ロック グラフ内のサイクルを防ぎ、実行順序がシリアル化可能な厳密なシーケンスに従うことを保証するため、シリアル化可能性 を保証します。
例:
- トランザクション T1 と T2 はデータ項目 A と B を更新する必要があります。2PL を使用すると、両方のトランザクションは成長フェーズで必要なロックを取得し、操作が完了した後 (縮小フェーズ) にのみロックを解放します。
デッドロックの処理
デッドロック は、2 つ以上のトランザクションが互いにロックを解放するのを待っているときに発生し、どのトランザクションも続行できない状況が発生します。これにより、1 つ以上のトランザクションがロールバックされない限り解決できない待機トランザクションのサイクルが作成されます。
デッドロックの防止
デッドロック防止技術は、トランザクションの動作に制限を課すことでデッドロックの発生を回避するように設計されています。デッドロックを防ぐための一般的な戦略の 1 つは、タイムスタンプを使用してトランザクションに優先順位を付けることです。
タイムスタンプベースのデッドロック防止スキーム
タイムスタンプを使用する 2 つの著名な デッドロック防止スキームがあります。
-
ウェイト・ダイ・スキーム:
- これは非プリエンプティブのデッドロック防止手法です。
- トランザクション Ti が Tj が保持するデータ項目を要求した場合、Ti は、そのタイムスタンプが Tj のタイムスタンプより小さい場合 (つまり、Ti が Tj より古い場合) にのみ待機できます。
- Ti のタイムスタンプが Tj のタイムスタンプより大きい場合、Ti はロールバックされます (つまり、Ti は「死亡」します)。
例:
- トランザクション T14、T15、および T16 のタイムスタンプがそれぞれ 5、10、および 15 である場合:
- T14 が T15 が保持するデータ項目を要求した場合、T14 の方が古いため、T14 は待機します。
- T16 が T15 が保持するデータ項目を要求した場合、T16 は T15 よりも若いため、T16 はロールバックされます。
-
傷待ちスキーム:
- これは先制的デッドロック防止手法です。
- トランザクション Ti が Tj が保持するデータ項目を要求した場合、Ti は、そのタイムスタンプが Tj のタイムスタンプより大きい場合 (つまり、Ti が Tj より若い場合) にのみ待機できます。
- Ti のタイムスタンプが Tj のタイムスタンプより小さい場合、Ti は Tj をプリエンプトし、Tj はロールバックされます (つまり、Tj は Ti によって「負傷」します)。
例:
- トランザクション T14、T15、および T16 のタイムスタンプがそれぞれ 5、10、および 15 である場合:
- T14 が T15 が保持するデータ項目を要求すると、T14 は T15 をプリエンプトし、T15 がロールバックされます。
- T16 が T15 が保持するデータ項目を要求した場合、T16 は T15 よりも若いため待機します。
タイムスタンプベースのプロトコル
ロックベースのプロトコルに加えて、タイムスタンプベースのプロトコルもデータベースの同時実行性を管理します。これらのプロトコルは、タイムスタンプを使用してトランザクションを順序付けし、競合を解決し、トランザクションが連続的に実行されているかのようにシステムが動作することを保証します。
タイムスタンプとその役割
タイムスタンプは、トランザクションの作成時にトランザクションに割り当てられる数値です。 トランザクションのタイムスタンプによって優先度が決まります。タイムスタンプの値が低いほどトランザクションが古いことを示し、値が高いほどトランザクションが新しいことを示します。
-
W-タイムスタンプ(Q):
- これは、データ項目 Q に対する書き込み操作が正常に実行されたトランザクションの最大のタイムスタンプを示します。
- データ項目を変更した最後のトランザクションを特定するのに役立ちます。
-
R-タイムスタンプ(Q):
- これは、データ項目 Q の読み取り操作を正常に実行したトランザクションの最大のタイムスタンプを示します。
- データ項目を読み取った最後のトランザクションを特定するのに役立ちます。
タイムスタンプ順序付けプロトコル
タイムスタンプ順序付けプロトコルは、タイムスタンプに基づいてトランザクションに合計順序を強制することでシリアル化可能性を保証します。プロトコルでは次のことが必要です:
- トランザクション Ti がデータ項目 Q を書き込み、別のトランザクション Tj が Q の読み取りまたは書き込みを行う場合、Ti のタイムスタンプは Tj より小さくなければなりません。
- 同様に、Ti がデータ項目 Q を読み取り、Tj が Q を書き込む場合、Ti のタイムスタンプは Tj より小さくなければなりません。
このプロトコルは、ロックではなくトランザクションのタイムスタンプに基づいて競合を解決します。
例:
- タイムスタンプ 10 のトランザクション T1 はデータ項目 A を書き込みます。
- タイムスタンプ 12 のトランザクション T2 がデータ項目 A を読み取ります。
- タイムスタンプ順序付けプロトコルにより、T1 の書き込み操作が T2 の読み取り操作の前に実行され、正しいトランザクション順序が維持されます。
以上がトランザクションと同時実行制御: DBMSの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。