書き込み分離
最初のフェーズでローカル トランザクションをコミットする前に、まずグローバル ロックが取得されていることを確認する必要があります。 グローバル ロックを取得できない場合、ローカル トランザクションを送信できません。 グローバル ロックの取得の試行は一定の範囲に制限されており、範囲を超えた場合は断念し、ローカル トランザクションをロールバックして、ローカル ロックを解放します。 例は次のとおりです。
2 つのグローバル トランザクション tx1 と tx2 はそれぞれテーブル a の m フィールドを更新し、m の初期値は 1000 です。
tx1 が最初に開始し、ローカル トランザクションを開始し、ローカル ロックを取得して、m=1000-100=900 を更新します。 ローカル トランザクションがコミットされる前に、まずレコードのグローバル ロックを取得し、ローカル コミットによってローカル ロックが解放されます。 tx2 の後に開始し、ローカル トランザクションを開始し、ローカル ロックを取得し、操作 m=900-100=800 を更新します。 ローカル トランザクションがコミットされる前に、レコードのグローバル ロックの取得を試みます。 tx1 がグローバルにコミットされる前に、レコードのグローバル ロックは tx1 によって保持され、tx2 は再試行してグローバル ロックを待つ必要があります。

tx1 2 フェーズ グローバル コミット、グローバル ロックを解放します。 tx2 はグローバル ロックを取得し、ローカル トランザクションを送信します。

tx1 の 2 段階のグローバル ロールバックの場合、tx1 はデータのローカル ロックを再取得し、逆補償の更新操作を実行し、ブランチのロールバックを実現する必要があります。 このとき、tx2 がローカル ロックを保持したままデータのグローバル ロックを待機している場合、tx1 のブランチ ロールバックは失敗します。 ブランチのロールバックは、tx2 のグローバル ロックがタイムアウトになるまで再試行され、グローバル ロックが放棄され、ローカル トランザクションがロールバックされてローカル ロックが解放され、tx1 のブランチがロールバックされます。
Last updated