例如,如果下面的脚本被调用,PostgreSQL将显示什么行为
BEGIN;
SELECT * FROM foo;
INSERT INTO foo(name) VALUES ('bar');
BEGIN; <- The point of interest
END;PostgreSQL会放弃第二个BEGIN,还是会隐式地决定提交,然后作为一个单独的事务在最后运行BEGIN END块?
发布于 2014-10-27 11:46:21
您需要的是所谓的“自主事务”(oracle提供的特性)。到目前为止,这在PostgreSQL中是不可能的。但是,您可以使用保存点s:
BEGIN;
INSERT ...
SAVEPOINT a;
some error;
ROLLBACK TO SAVEPOINT a;
COMMIT;它并不是一个完全自主的事务-但是,它允许您得到“每一个事务”的权利。您可以使用它来实现您对自治事务的期望。
否则,目前没有其他合理的解决办法。
发布于 2014-10-24 13:49:36
你可以自己试试:
警告:已经有一项交易正在进行中。
它不会启动新的(子)事务,因为嵌套事务没有在PostgreSQL中实现。(例如,您可以在pl/pgsql函数中使用一些魔术来模仿这种行为。)
使用PostgreSQL 11,人们可以认为新的真正的存储过程及其处理事务的能力将使嵌套事务成为可能。然而,根据文档的说法,情况并非如此:
在
CALL命令调用的过程以及匿名代码块(DO命令)中,可以使用命令COMMIT和ROLLBACK结束事务。使用这些命令结束事务后,将自动启动新事务,因此没有单独的开始事务命令。
发布于 2017-03-03 23:19:06
对于PostgreSQL9.5或更高版本,可以使用pg_background扩展提供的动态后台工作人员。它创建自主事务。请参考分机的github页面。固溶效果好于db_link。有关于PostgreSQL中的自主事务支持的完整指南
https://dba.stackexchange.com/questions/81011
复制相似问题