Postgresはネストされたトランザクションをサポートしますが、ネストされた部分的なポイントを持つトランザクションのように、従来のSQLとは異なります。
トップレベルには、常に典型的なBEGIN/COMMIT/ROLLBACKがあります。 、およびネストされたレベルでは、次のコマンドを使用する必要があります:
SAVEPOINT name-トランザクションに固有の名前で新しいセーブポイントを作成しますRELEASE SAVEPOINT name-セーブポイントをコミットしますが、含まれているトランザクションがコミットした場合にのみ保持されますROLLBACK TO SAVEPOINT name-セーブポイントをロールバックします
また、次のことを確認する必要があります。
- 各
SAVEPOINTに使用される名前 ユニークです; - 1つの
SAVEPOINTでの失敗 トップレベルまで上向きに伝播されます。
自動的にそれを実行できるライブラリを使用しない限り、最後のビットは少し注意が必要です。
pg-promiseを書いたとき、これら2つの規定が保証されていることを確認しました。
-
level_1として、セーブポイント名を自動的に生成します 、level_2、など、トランザクションレベルに基づきます。 -
ROLLBACK TO SAVEPOINT nameを含めて実行します 、およびトップレベルのROLLBACK子トランザクションが失敗した場合-すべて標準のpromise-chainingロジックに基づいて構築されています。
説明されているPostgreSQLネストトランザクションの制限も参照してください...