与 postgresql 的交易
transaction with postgresql
我是 Postgresql 的新手,我尝试用 Oracle 做一些如此简单的事情。
我创建了一个程序,里面有一段简单的代码:
CREATE OR REPLACE PROCEDURE user.test_proc(IN param1 character varying)
LANGUAGE 'plpgsql'
AS $BODY$
DECLARE
i text;
BEGIN
if param1 = '1' then
insert into amian.test values ('1', '1');
rollback;
else
insert into amian.test values('2','2');
commit;
end if;
end;
$BODY$;
我在 unix 环境中使用 psql :
psql –p port–d base–U user
\set AUTOCOMMIT off
call user.test_proc('2');
程序遇到 COMMIT 时出现此错误:
invalid transaction termination
怎么了?我应该怎么做(我想关闭自动提交)?
谢谢
如果过程在其自己的事务中 运行(自动提交模式),则只能在过程中使用 COMMIT
和 ROLLBACK
。请参阅 the documentation 中的这句话:
If CALL
is executed in a transaction block, then the called procedure cannot execute transaction control statements. Transaction control statements are only allowed if CALL
is executed in its own transaction.
在 psql
中关闭自动提交会导致客户端在 CALL
语句之前发送 BEGIN
,因此您处于显式启动的事务中。这导致了问题。
此限制可能会在未来的某个时候取消,但目前是这样。
不要禁用自动提交。您正在冒着长时间事务的风险,这可能会损害数据库的健康状况。
我是 Postgresql 的新手,我尝试用 Oracle 做一些如此简单的事情。
我创建了一个程序,里面有一段简单的代码:
CREATE OR REPLACE PROCEDURE user.test_proc(IN param1 character varying)
LANGUAGE 'plpgsql'
AS $BODY$
DECLARE
i text;
BEGIN
if param1 = '1' then
insert into amian.test values ('1', '1');
rollback;
else
insert into amian.test values('2','2');
commit;
end if;
end;
$BODY$;
我在 unix 环境中使用 psql :
psql –p port–d base–U user
\set AUTOCOMMIT off
call user.test_proc('2');
程序遇到 COMMIT 时出现此错误:
invalid transaction termination
怎么了?我应该怎么做(我想关闭自动提交)?
谢谢
如果过程在其自己的事务中 运行(自动提交模式),则只能在过程中使用 COMMIT
和 ROLLBACK
。请参阅 the documentation 中的这句话:
If
CALL
is executed in a transaction block, then the called procedure cannot execute transaction control statements. Transaction control statements are only allowed ifCALL
is executed in its own transaction.
在 psql
中关闭自动提交会导致客户端在 CALL
语句之前发送 BEGIN
,因此您处于显式启动的事务中。这导致了问题。
此限制可能会在未来的某个时候取消,但目前是这样。
不要禁用自动提交。您正在冒着长时间事务的风险,这可能会损害数据库的健康状况。