大势趋007

每个人都是🏆
  新随笔  :: 管理

SAVEPOINT, ROLLBACK TO SAVEPOINT, and RELEASE SAVEPOINT Statements

Posted on 2025-08-29 09:29  大势趋007  阅读(10)  评论(0)    收藏  举报

SAVEPOINT, ROLLBACK TO SAVEPOINT, and RELEASE SAVEPOINT Statements

https://dev.mysql.com/doc/refman/8.0/en/savepoint.html

InnoDB 支持如下 SQL 语句:

  • SAVEPOINT
  • ROLLBACK TO SAVEPOINT
  • RELEASE SAVEPOINT
    以及用于 ROLLBACK 的可选关键字 WORK。

语法

  • SAVEPOINT identifier:设置一个标记为 identifier 的事务保存点。如果当前事务已存在同名保存点,则删除旧保存点并设置新的保存点。

  • ROLLBACK [WORK] TO [SAVEPOINT] identifier:回滚事务至指定的保存点,而不终止事务。会撤销在保存点设置之后事务对行的修改,但不会释放内存中保存点后的行锁。(对于新插入的行,锁信息通过事务 ID 存储于行中,在撤销中释放锁)较晚的保存点将被删除。

    如果出现错误 ERROR 1305 (42000): SAVEPOINT identifier does not exist,这意味着指定名称的保存点不存在。

  • RELEASE SAVEPOINT identifier:从当前事务保存点集合中删除指定保存点,既不提交也不回滚。如果保存点不存在,将产生错误。

保存点行为

  • COMMIT 或未经命名的 ROLLBACK: 当前事务的所有保存点被删除。
  • 存储函数或触发器:调用或激活时创建一个新的保存点级别,之前级别的保存点变得不可用,以避免冲突。函数或触发器终止时,所创建的保存点会被释放,原保存点级别被恢复。

总结

  • 保存点允许事务内部分回滚,增加控制细度。
  • 在事务提交或整体回滚时,所有保存点将被删除。
  • 使用存储函数和触发器时,会产生新的保存点层级,防止上下级保存点冲突。