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

PostgreSQLの機能はトランザクションですか?

    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 およびsetvalTRUNCATE 、など。



    1. ClouderaCDPデータセンターをOracleCloudInfrastructure(OCI)にデプロイする

    2. PostgreSQLデータベースを保護する方法-10のヒント

    3. 修正方法「WITHRESULTSETS句で結果セットに2列が指定されたため、EXECUTEステートメントが失敗しました…」SQLServerのメッセージ11537

    4. SQLテーブルデータをテキストテーブルとしてフォーマットする