加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 站长学院 > MsSql教程 > 正文

sql – Postgres是否支持嵌套或自主交易?

发布时间:2020-12-12 08:49:08 所属栏目:MsSql教程 来源:网络整理
导读:我有一种情况,我必须将一部分代码作为自己的交易. 我已经创建了一个表subtransaction_tbl: CREATE TABLE subtransaction_tbl( entryval integer) 和一个功能在语言plpython3u: CREATE FUNCTION subtransaction_nested_test_t() RETURNS voidAS $$plpy.execu
我有一种情况,我必须将一部分代码作为自己的交易.
我已经创建了一个表subtransaction_tbl:
CREATE TABLE subtransaction_tbl
(
  entryval integer
)

和一个功能在语言plpython3u:

CREATE FUNCTION subtransaction_nested_test_t() RETURNS void
AS $$
plpy.execute("INSERT INTO subtransaction_tbl VALUES (1)")
with plpy.subtransaction():
    plpy.execute("INSERT INTO subtransaction_tbl VALUES (2)")
$$LANGUAGE plpython3u;

第一种情况:

BEGIN TRANSACTION;
INSERT INTO subtransaction_tbl VALUES (4);
select  subtransaction_nested_test_t();
COMMIT TRANSACTION;

表中的条目正确:1,2,4

第二种情况:

BEGIN TRANSACTION;
INSERT INTO subtransaction_tbl VALUES (4);
select  subtransaction_nested_test_t();
ROLLBACK TRANSACTION;

表中的值未填充

我预计1或2应该添加到表subtransaction_tbl,但令我吃惊的是没有插入任何值.我想象了一个新的子事务被函数打开,它不应该依赖于父事务.如果我对不对,请通知我

Postgres有自动交易吗?还是要修改我的plpython3u函数?

解决方法

Postgres直到Postgres和9.4之间都没有自主交易.在函数中完成的所有内容都将随交易回滚.

项目列表中有一个开放的TODO项目:

> https://wiki.postgresql.org/wiki/Todo

以下是对此功能的讨论:

> http://wiki.postgresql.org/wiki/Autonomous_subtransactions

现在,解决方法可能是(ab-)使用dblink

> dblink can’t update a table on the same database in an after UPDATE trigger
> How do I do large non-blocking updates in PostgreSQL?

还有一个SAVEPOINT的相关概念(不一样的事情!):

plpython

plpython具有子事务(使用plpy.subtransaction():),但这与自治事务不同.没有单独的COMMIT.它所做的一切都是捆绑在一起,使它们成为原子.如果没有这种情况,如果异常发生在中间的某个地方,并且您捕获该异常,则只会执行直到该异常的代码.如果你把它包装成一个子交易,这是全部或全部.这就像使用SAVEPOINT而不是一个自主的事务. Per documentation:

The subtransaction context manager does not trap errors,it only assures that all database operations executed inside its scope will be atomically committed or rolled back.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读