transaction_rollback_scope parameter#

データベース内のトランザクションロールバックスコープを設定するには、 transaction_rollback_scope パラメーターを使用します。 transaction_rollback_scope パラメーターには、2つの値があります。

  • transaction —標準のPostgres動作。各エラーはトランザクション全体を中止します。

  • statement — 1つのステートメントの実行中のエラーは、そのステートメントにのみ影響を及ぼし、トランザクション全体のステータスには影響しません。

パラメーターの設定#

パラメーターをユーザーレベルのプロパティ、接続オプション、または特定のファンクションまたはプロシージャーのモードとして設定できます。

パラメーターをユーザーレベルのプロパティとして設定します#

ALTER USER somebody SET transaction_rollback_scope TO statement;

パラメーターを接続オプションとして設定する#

PGOPTIONS="-c transaction_rollback_scope=statement" psql <other options>

特定のファンクションまたはプロシージャのモードを設定する#

PL/pgSQLを使用する場合、特定のファンクションまたはプロシージャのモードを設定できます。

ALTER FUNCTION myfunc SET transaction_rollback_scope TO statement;

サブトランザクションの処理方法#

statement 値を選択した場合、各SQLコマンドの直前にサブトランザクションが開きます。コマンドが成功した場合、サブトランザクションは コミット されます。コマンドによってエラーが発生した場合、サブトランザクションはロールバックされ、親トランザクションは通常に続行できます。その結果、1つのステートメントの実行中のエラーは、そのステートメントにのみ影響を与え、トランザクション全体のステータスには影響しません。

サブトランザクションをコミットすると、それが保持するリソースがその親トランザクションにのみ割り当てられます。これがトップレベルのトランザクションである場合があります。または、ユーザー定義のセーブポイントが関係する場合、それは他のサブトランザクションである可能性があります。したがって、これは「自律トランザクション」ではありません。サブトランザクションをロールバックすると、取得したロックなど、保持しているすべてのリソースが解放されます。