PREPARE TRANSACTION
を誤解されたと思います 。
そのステートメントはトランザクションの作業を終了します。つまり、後に発行する必要があります。 すべての作業が完了しました。アイデアは、PREPARE TRANSACTION
ということです コミット自体を除いて、コミット中に失敗する可能性のあるすべてのことを行います。これは、後続のCOMMIT PREPARED
を保証するためです。 失敗することはできません。
処理は次のようになります。
-
START TRANSACTION
を実行します 分散トランザクションに関係するすべてのデータベース。 -
すべての作業を行います。エラーがある場合は、
ROLLBACK
すべてのトランザクション。 -
PREPARE TRANSACTION
を実行します すべてのデータベースで。それがどこかで失敗した場合は、ROLLBACK PREPARED
を実行します トランザクションがすでに準備されているデータベースとROLLBACK
他の人に。 -
一度
PREPARE TRANSACTION
どこでも成功しました。COMMIT PREPARED
を実行してください 関連するすべてのデータベースで。
そうすれば、複数のデータベースにわたって「オールオアナッシング」を保証できます。
ここで私が言及していない重要なコンポーネントの1つは、分散トランザクションマネージャーです。 。これは、上記のアルゴリズム処理の現在の場所を永続的に記憶し、クラッシュ後にクリーンアップまたはコミットを続行できるようにするソフトウェアです。
分散トランザクションマネージャーがないと、2フェーズコミットはあまり価値がなく、実際には危険です。トランザクションが「準備済み」フェーズでスタックしたが、まだコミットされていない場合、それらはロックを保持し続けます( PostgreSQL)サーバーの再起動後も自動バキューム作業をブロックする 、そのようなトランザクションは永続的である必要があるためです。
これを正しく行うのは困難です。