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