已索引

我们知道,事务作为一个整体,发么都做,要么都不做,我们可以使用rollback来撤销一事务,例如:

commit;    上一个事务结束,新的事务开始
insert 1;
insert 2;
delete 1;
update 1;
rollback;

发出rollback后,该事务撤销,前面4条DML语句都被撤销。

savepoint 为我们提供了一种撤销到某条语句的机制。例如:

commit;    上一个事务结束,新的事务开始
insert 1;
insert 2;
SAVEPOINT A;
delete 1;
SAVEPOINT B
update 1;
SAVEPOINT C
insert 3;
ROLLBACK TO SAVEPOINT C;  ----- insert 3语句将被撤销,之前的DML语句被保留下来
ROLLBACK TO SAVEPOINT A;   ----- insert 3, update 1, delete 1被撤销,之前的两条insert 1和insert 2被保留
ROLLBACK TO SAVEPOINT B;  ----- 该语句将报错,因为已经撤销到A,B已经不存在了
ROLLBACK;    整个事务将被撤销,事务结束

savepoint 命令允许在事务进行中设置一个标记(保存点),这个标记可以控制 rollback 的效果,即在一个事务中回滚掉最近的部分 dml 语句,保留下保存点之前的的 dml 语句,并使事务本身继续执行(考点)。也就是说回滚到保存点这个动作并不使事务结束。

注意:

  • You cannot COMMIT to a SAVEPOINT.
  • SAVEPOINT is not ANSI-standard SQL.
  • Because savepoints are logical, there is no way to list the savepoints that you have created.
  • If you create a second savepoint with the same name as an earlier savepoint, the earlier savepoint is deleted.
  • All savepoints are erased once the transaction is commited.
  • rollback to xxx 并不会结束事务(事务在v$transaction中的记录还在).
-- By 许望(RHCA、OCM、VCP)
最后修改:2024 年 02 月 05 日 03 : 35 PM
如果觉得我的文章对你有用,请随意赞赏