2014-10-16 111 views
3

我正在使用PostgreSQL 9.3,並且我創建了一些包含多個語句的存儲過程。我在準備好的語句的幫助下,在Java應用程序中調用這個存儲過程。執行postgreSQL存儲過程作爲一個事務

現在我已經讀過,存儲過程中的每個語句都是作爲一個事務執行的,即每個語句後的一個提交。但我想要的是將整個存儲過程作爲一個事務執行,即只有一個提交。

我該怎麼做?也許停用JDBC級別的自動提交?

+0

禁用自動提交併在啓動事務後調用該函數。 – 2014-10-16 14:01:34

+0

@a_horse_with_no_name你是指第一個dbConnection.setAutoCommit(false); (事務塊開始)然後我做準備的語句,然後我做dbConnection.commit();.這是正確的嗎?我必須關心回滾嗎? – machinery 2014-10-16 14:12:23

回答

12

那麼,基本上存儲過程原子性質和作爲一個交易執行。

CREATE TABLE xxx (id int PRIMARY KEY); 

CREATE OR REPLACE FUNCTION f() RETURNS void AS $$ 
DECLARE 
    len int; 
BEGIN 
    RAISE NOTICE 'Transaction ID: %', TXID_CURRENT(); 
    INSERT INTO xxx VALUES (1); 

    RAISE NOTICE 'Transaction ID: %', TXID_CURRENT(); 
    INSERT INTO xxx VALUES (2); 

    RAISE NOTICE 'Transaction ID: %', TXID_CURRENT(); 
    SELECT COUNT(*) FROM xxx INTO len; 
    RAISE NOTICE 'Number of records: %', len; 

    RAISE NOTICE 'Transaction ID: %', TXID_CURRENT(); 

    -- results in unique constraint violation 
    UPDATE xxx SET id = 3; 
END; 
$$ LANGUAGE plpgsql; 

然後嘗試從psql調用f()

stackoverflow=# show autocommit; 
autocommit 
------------ 
on 
(1 row) 

stackoverflow=# SELECT f(); 
NOTICE: Transaction ID: 15086 
NOTICE: Transaction ID: 15086 
NOTICE: Transaction ID: 15086 
NOTICE: Number of records: 2 
NOTICE: Transaction ID: 15086 
ERROR: duplicate key value violates unique constraint "xxx_pkey" 
DETAIL: Key (id)=(3) already exists. 
CONTEXT: SQL statement "UPDATE xxx SET id = 3" 
PL/pgSQL function f() line 20 at SQL statement 

stackoverflow=# SELECT * FROM xxx; 
id 
---- 
(0 rows) 
+2

不僅如此,即使您想要,您也無法在存儲過程中執行「COMMIT」。 – 2014-10-16 23:25:41