ROLLBACK TO SAVEPOINT用于回滚事务中部分操作,配合SAVEPOINT实现事务内部分回滚。首先开启事务并执行操作,如插入日志;接着设置保存点before_balance_update;随后执行关键操作如更新余额,若失败则回滚到该保存点,保留此前的日志记录;最后可记录失败状态并提交事务。保存点仅在当前事务有效,需使用支持事务的存储引擎如InnoDB。此机制适用于需精细控制回滚范围的场景,提升事务处理灵活性。

在 MySQL 中,ROLLBACK TO SAVEPOINT 用于回滚事务中的部分操作,而不是整个事务。它配合 SAVEPOINT 使用,允许你在事务中设置一个保存点,之后可以回退到该点,保留之前已执行的某些操作。
1. 基本语法
设置保存点:SAVEPOINT 保存点名称;
回滚到保存点:
ROLLBACK TO SAVEPOINT 保存点名称;
释放保存点(可选):
RELEASE SAVEPOINT 保存点名称;
JTBC CMS(5.0) 是一款基于PHP和MySQL的内容管理系统原生全栈开发框架,开源协议为AGPLv3,没有任何附加条款。系统可以通过命令行一键安装,源码方面不基于任何第三方框架,不使用任何脚手架,仅依赖一些常见的第三方类库如图表组件等,您只需要了解最基本的前端知识就能很敏捷的进行二次开发,同时我们对于常见的前端功能做了Web Component方式的封装,即便是您仅了解HTML/CSS也
2. 使用场景示例
假设你在处理用户转账时,想先记录日志,再更新余额。如果更新余额失败,你希望只回滚余额操作,但保留日志记录。这时可以用保存点实现部分回滚。
示例代码:
-- 开启事务 START TRANSACTION;-- 插入操作日志 INSERT INTO operation_log (action, status) VALUES ('transfer', 'started');
-- 设置保存点 SAVEPOINT before_balance_update;
-- 更新用户余额(假设这里出错) UPDATE accounts SET balance = balance - 100 WHERE user_id = 1; UPDATE accounts SET balance = balance + 100 WHERE user_id = 2;
-- 如果上面更新失败,比如外键约束或金额不足 -- 回滚到保存点,但保留日志插入 ROLLBACK TO SAVEPOINT before_balance_update;
-- 可以选择继续执行其他操作 INSERT INTO operation_log (action, status) VALUES ('transfer', 'failed');
-- 提交事务 COMMIT;
3. 注意事项
- 保存点仅在当前事务内有效,事务提交或完全回滚后自动清除。
- MySQL 的存储引擎必须支持事务(如 InnoDB),MyISAM 不支持。
- 回滚到保存点后,该保存点之后的所有更改都会被撤销,但保存点本身仍然存在,可再次回滚或释放。
- 不能回滚到在嵌套事务中创建的保存点(MySQL 不支持真正的嵌套事务)。
4. 实际建议
使用保存点适合复杂事务中需要精细控制回滚范围的场景。例如数据校验失败、触发器异常或条件不满足时,避免全部重来。
记得在测试环境中验证逻辑,避免因回滚位置错误导致数据不一致。
基本上就这些,合理使用 SAVEPOINT 和 ROLLBACK TO 能提升事务处理的灵活性。









