首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >在PostgreSQL中重新启动失败的事务

在PostgreSQL中重新启动失败的事务
EN

Stack Overflow用户
提问于 2013-12-14 14:11:30
回答 1查看 2.9K关注 0票数 3

所谓事务,我指的是几个封装在begin isolation level serializable块中的SQL语句(例如)。并发事务会导致事务失败,即回滚。

如何在PostgreSQL中重新启动失败的事务?

EN

回答 1

Stack Overflow用户

发布于 2017-01-29 13:04:23

这一答案是三年后添加的,以说明自那时以来的变化。尽管最初的答案仍然有效,但这个答案表明,用当时无法使用的正确工具来完成今天的任务是多么容易。

使用pg-承诺很容易,它支持任何嵌套级别的嵌套事务。请参见BEGIN->COMMIT/ROLLBACK,,其中解释说,虽然顶级事务是由标准的嵌套事务表示的,但所有嵌套事务都会自动成为SAVEPOINT

代码语言:javascript
运行
复制
db.tx(t => {
    // BEGIN
    // top-level changes cannot be restarted:
    return t.any('UPDATE users SET name=$1 WHERE id=$2', ['Mike', 123])
        .then(() => {
            return t.tx(t1 => {
                // SAVEPOINT
                return t1.none('INSERT log(event) VALUES($1)', 'entry');
            })
                .catch(error => {
                    // ROLLBACK TO SAVEPOINT executed
                    return t.none('UPDATE log SET event = $1');
                });
        });
})
    .then(data => {
        // success, COMMIT executed
    })
    .catch(error => {
        // error, ROLLBACK executed
    });

在上面的示例中,我们在顶层执行一个UPDATE,由于这个原因不能重新启动它。然后,我们使用INSERT执行嵌套事务/保存点,如果失败,将再次替换为顶层的UPDATE

这样,即使我们的SAVEPOINT失败了,我们仍然可以成功地完成顶级事务.

如果您希望能够重新启动整个事务,只需将整个事务包装成一个子事务,然后您可以在主事务中任意次数地重新运行它。

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

https://stackoverflow.com/questions/20584315

复制
相关文章

相似问题

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