3
我正在使用PostgreSQL 9.3,並且我創建了一些包含多個語句的存儲過程。我在準備好的語句的幫助下,在Java應用程序中調用這個存儲過程。執行postgreSQL存儲過程作爲一個事務
現在我已經讀過,存儲過程中的每個語句都是作爲一個事務執行的,即每個語句後的一個提交。但我想要的是將整個存儲過程作爲一個事務執行,即只有一個提交。
我該怎麼做?也許停用JDBC級別的自動提交?
我正在使用PostgreSQL 9.3,並且我創建了一些包含多個語句的存儲過程。我在準備好的語句的幫助下,在Java應用程序中調用這個存儲過程。執行postgreSQL存儲過程作爲一個事務
現在我已經讀過,存儲過程中的每個語句都是作爲一個事務執行的,即每個語句後的一個提交。但我想要的是將整個存儲過程作爲一個事務執行,即只有一個提交。
我該怎麼做?也許停用JDBC級別的自動提交?
那麼,基本上存儲過程是原子性質和作爲一個交易執行。
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)
不僅如此,即使您想要,您也無法在存儲過程中執行「COMMIT」。 – 2014-10-16 23:25:41
禁用自動提交併在啓動事務後調用該函數。 – 2014-10-16 14:01:34
@a_horse_with_no_name你是指第一個dbConnection.setAutoCommit(false); (事務塊開始)然後我做準備的語句,然後我做dbConnection.commit();.這是正確的嗎?我必須關心回滾嗎? – machinery 2014-10-16 14:12:23