所谓事务,我指的是几个封装在begin isolation level serializable
块中的SQL语句(例如)。并发事务会导致事务失败,即回滚。
如何在PostgreSQL中重新启动失败的事务?
发布于 2017-01-29 13:04:23
这一答案是三年后添加的,以说明自那时以来的变化。尽管最初的答案仍然有效,但这个答案表明,用当时无法使用的正确工具来完成今天的任务是多么容易。
使用pg-承诺很容易,它支持任何嵌套级别的嵌套事务。请参见BEGIN
->COMMIT
/ROLLBACK
,,其中解释说,虽然顶级事务是由标准的嵌套事务表示的,但所有嵌套事务都会自动成为SAVEPOINT
。
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
失败了,我们仍然可以成功地完成顶级事务.
如果您希望能够重新启动整个事务,只需将整个事务包装成一个子事务,然后您可以在主事务中任意次数地重新运行它。
https://stackoverflow.com/questions/20584315
复制相似问题