sql >> データベース >  >> RDS >> PostgreSQL

postgresで2フェーズコミットを使用する

    PREPARE TRANSACTIONを誤解されたと思います 。

    そのステートメントはトランザクションの作業を終了します。つまり、後に発行する必要があります。 すべての作業が完了しました。アイデアは、PREPARE TRANSACTIONということです コミット自体を除いて、コミット中に失敗する可能性のあるすべてのことを行います。これは、後続のCOMMIT PREPAREDを保証するためです。 失敗することはできません。

    処理は次のようになります。

    • START TRANSACTIONを実行します 分散トランザクションに関係するすべてのデータベース。

    • すべての作業を行います。エラーがある場合は、ROLLBACK すべてのトランザクション。

    • PREPARE TRANSACTIONを実行します すべてのデータベースで。それがどこかで失敗した場合は、ROLLBACK PREPAREDを実行します トランザクションがすでに準備されているデータベースとROLLBACK 他の人に。

    • 一度PREPARE TRANSACTION どこでも成功しました。COMMIT PREPAREDを実行してください 関連するすべてのデータベースで。

    そうすれば、複数のデータベースにわたって「オールオアナッシング」を保証できます。

    ここで私が言及していない重要なコンポーネントの1つは、分散トランザクションマネージャーです。 。これは、上記のアルゴリズム処理の現在の場所を永続的に記憶し、クラッシュ後にクリーンアップまたはコミットを続行できるようにするソフトウェアです。

    分散トランザクションマネージャーがないと、2フェーズコミットはあまり価値がなく、実際には危険です。トランザクションが「準備済み」フェーズでスタックしたが、まだコミットされていない場合、それらはロックを保持し続けます( PostgreSQL)サーバーの再起動後も自動バキューム作業をブロックする 、そのようなトランザクションは永続的である必要があるためです。

    これを正しく行うのは困難です。




    1. mysql-既存のタイムスタンプからインデックス付きの時間列を作成します

    2. ORA-01735:ALTERTABLEオプションが無効です-Toad

    3. OracleDATEインデックス

    4. joomlaの全文クエリ