PostgreSQL12アップデート :トップレベルのPROCEDURE
のサポートは制限されています ■トランザクション制御を実行できる。それでも通常のSQL呼び出し可能関数でトランザクションを管理することはできないため、新しいトップレベルのプロシージャを使用する場合を除いて、以下は当てはまります。
関数は、それらが呼び出されるトランザクションの一部です。トランザクションがロールバックされると、それらの効果はロールバックされます。トランザクションがコミットされると、彼らの作業はコミットされます。任意のBEGIN ... EXCEPT
関数内のブロックは、SAVEPOINT
のようなセーブポイントのように(そして内部で使用して)動作します およびROLLBACK TO SAVEPOINT
SQLステートメント。
BEGIN ... EXCEPT
を除いて、関数は完全に成功するか、完全に失敗します。 エラー処理。関数内でエラーが発生し、処理されない場合、関数を呼び出すトランザクションは中止されます。中止されたトランザクションはコミットできず、COMMIT
をコミットしようとした場合 ROLLBACK
として扱われます 、エラーのある他のトランザクションの場合と同じです。観察する:
regress=# BEGIN;
BEGIN
regress=# SELECT 1/0;
ERROR: division by zero
regress=# COMMIT;
ROLLBACK
ゼロ除算のためにエラー状態にあるトランザクションが、COMMIT
でどのようにロールバックするかを確認してください。 ?
明示的なサラウンドトランザクションなしで関数を呼び出す場合、ルールは他のPgステートメントの場合とまったく同じです。
BEGIN;
SELECT refresh_materialized_view(name);
COMMIT;
(ここでCOMMIT
SELECT
の場合、失敗します エラーが発生しました。
PostgreSQLは、関数内の自律型トランザクションを(まだ)サポートしていません。この場合、プロシージャ/関数は、呼び出し元のトランザクションとは無関係にコミット/ロールバックできます。これは、dblinkを介した新しいセッションを使用してシミュレートできます。
しかし 、トランザクションではない、または不完全にトランザクションであるものがPostgreSQLに存在します。通常のBEGIN; do stuff; COMMIT;
ブロック、それは関数でも非トランザクション動作をします。たとえば、nextval
およびsetval
、TRUNCATE
、など。