1

有没有办法回滚到“提交的保存点”?

Afaik,postgresql 支持的实际保存点是子事务,当封闭事务提交或中止时,它们就失去了意义。是否存在跨事务边界的“保存点”?

基本上,我想要的是按顺序执行这三个事务:

交易~A

BEGIN TRANSACTION;
    COMMIT SAVEPOINT 'before_a';
    DO SOMETHING;
COMMIT TRANSACTION;

交易~B

BEGIN TRANSACTION;
    DO SOMETHING_ELSE;
COMMIT TRANSACTION;

交易~C

BEGIN TRANSACTION
    ROLLBACK TO COMMITED SAVEPOINT 'before_a'; -- discards work done in A and B
COMMIT TRANSACTION

原因是我正在编写(Java)回归测试。

在错误的情况下,DO SOMETHING_ELSE尝试提交 B 时会触发事务提交异常(我相信在 DELETE 上违反了一些外键约束),但前提是事务 A 中完成的工作已经提交。

由于问题现已解决,事务 B 将提交。但是这样做,A 和 B 都会在数据库中留下一些副产品。如果下一个测试应该有任何成功的机会,现在需要从数据库中清除这些。

手动跟踪这些副产品非常困难,因此事务 C 应该删除这些副产品。

4

1 回答 1

0

正如评论中提到的,这在 PostgreSQL 中是不可能的。

您唯一的希望是在封装事务中使用子事务:

BEGIN;
SAVEPOINT before_a;
/* perform the work for A */
/* perform the work for B */

如果 B 失败,请执行以下操作:

ROLLBACK TO SAVEPOINT before_a;

然后,无论 B 是否失败:

/* perform the work for C */
COMMIT;
于 2020-04-10T05:00:40.083 回答