首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >事务内的事务

事务内的事务
EN

Database Administration用户
提问于 2014-10-24 09:35:06
回答 3查看 30.9K关注 0票数 25

例如,如果下面的脚本被调用,PostgreSQL将显示什么行为

代码语言:javascript
复制
BEGIN;
SELECT * FROM foo;
INSERT INTO foo(name) VALUES ('bar');
BEGIN; <- The point of interest
END;

PostgreSQL会放弃第二个BEGIN,还是会隐式地决定提交,然后作为一个单独的事务在最后运行BEGIN END块?

EN

回答 3

Database Administration用户

回答已采纳

发布于 2014-10-27 11:46:21

您需要的是所谓的“自主事务”(oracle提供的特性)。到目前为止,这在PostgreSQL中是不可能的。但是,您可以使用保存点s:

代码语言:javascript
复制
BEGIN;
INSERT ...
SAVEPOINT a;
some error;
ROLLBACK TO SAVEPOINT a;
COMMIT;

它并不是一个完全自主的事务-但是,它允许您得到“每一个事务”的权利。您可以使用它来实现您对自治事务的期望。

否则,目前没有其他合理的解决办法。

票数 18
EN

Database Administration用户

发布于 2014-10-24 13:49:36

你可以自己试试:

警告:已经有一项交易正在进行中。

它不会启动新的(子)事务,因为嵌套事务没有在PostgreSQL中实现。(例如,您可以在pl/pgsql函数中使用一些魔术来模仿这种行为。)

使用PostgreSQL 11,人们可以认为新的真正的存储过程及其处理事务的能力将使嵌套事务成为可能。然而,根据文档的说法,情况并非如此:

CALL命令调用的过程以及匿名代码块(DO命令)中,可以使用命令COMMITROLLBACK结束事务。使用这些命令结束事务后,将自动启动新事务,因此没有单独的开始事务命令。

票数 15
EN

Database Administration用户

发布于 2017-03-03 23:19:06

对于PostgreSQL9.5或更高版本,可以使用pg_background扩展提供的动态后台工作人员。它创建自主事务。请参考分机的github页面。固溶效果好于db_link。有关于PostgreSQL中的自主事务支持的完整指南

票数 0
EN
页面原文内容由Database Administration提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://dba.stackexchange.com/questions/81011

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档