2016-10-05 8 views
0

postgresqlのネストされた関数とトランザクションに関する質問があります。ご存じのように、postgresqlの各関数はトランザクション内にあります。内部関数が失敗したかどうか、外部関数で行われたすべての変更がロールバックされるかどうか不思議です。ここ PostgreSQLのネストされた関数とトランザクション

は一例

function 1(){ 

    insert some data into table 1; 
    call function2 
    insert some data into table 2; 


} 

あるウィル機能2でいくつかのエラーは、ロールバック「表1の挿入」が表示されていますか?

アドバイスはありますか?

答えて

0

はい、ロールバック可能なセーブポイントを設定しない限りです。 PL/pgSQLで

が、これは暗黙的にBEGIN ... EXCEPTION ... END;ブロックで行われるので、以下ではまずINSERTをロールバックしません。

CREATE FUNCTION function 1() RETURNS void 
    LANGUAGE plpgsql AS 
$$BEGIN 
    insert some data into table 1; 
    BEGIN 
     function2(); 
    EXCEPTION 
     WHEN others THEN /* catch any exception */ 
     NULL;/ignore error */ 
    END; 
    insert some data into table 2; 
END;$$; 

詳細についてはthe documentationを参照してください。

他の言語では、さまざまな方法があります。

関連する問題