ROLLBACK用于撤销显式开启且未提交的事务中所有DML操作,恢复数据库到事务开始前状态;不支持DDL、MyISAM引擎及自动提交模式下的操作。

在 MySQL 中,事务回滚(ROLLBACK)用于撤销当前事务中尚未提交的所有数据修改操作,使数据库恢复到事务开始前的一致状态。关键前提是:该事务必须是显式开启的(即使用 START TRANSACTION 或 BEGIN),且尚未执行 COMMIT。
事务回滚的基本语法
MySQL 中回滚事务只需一条简单命令:
ROLLBACK;
这条语句会立即撤销当前事务中所有 INSERT、UPDATE、DELETE 等 DML 操作,并释放事务持有的锁。注意:DDL 语句(如 CREATE、DROP、ALTER)在执行时会自动触发隐式提交,无法被 ROLLBACK 撤销。
回滚前必须确保事务处于活动状态
只有在事务启动后、提交前才能回滚。常见误操作包括:
- 未用 START TRANSACTION 或 BEGIN 显式开启事务,直接执行 SQL 后尝试 ROLLBACK —— 此时 MySQL 默认处于自动提交模式(autocommit=1),每条语句单独提交,无事务可回滚;
- 已执行 COMMIT —— 提交后更改永久生效,无法通过 ROLLBACK 恢复;
- 事务因错误(如主键冲突、死锁)被 MySQL 自动终止 —— 此时需重新开启事务再操作,不能对已中断的事务调用 ROLLBACK。
如何安全使用回滚:典型操作流程
推荐按以下步骤操作,避免意外丢失数据:
- 先确认当前 autocommit 状态:SELECT @@autocommit;(返回 1 表示开启,0 表示关闭);
- 显式开启事务:START TRANSACTION;(或 BEGIN;);
- 执行一组相关 DML 操作(例如:UPDATE users SET status='active' WHERE id=100; DELETE FROM logs WHERE created_at
- 检查结果是否符合预期;若出错或需放弃,立即执行 ROLLBACK;;若确认无误,执行 COMMIT;。
回滚不生效?常见原因排查
如果执行 ROLLBACK 后数据未恢复,可能因为:
- 表引擎不支持事务 —— MyISAM 引擎不支持事务和回滚,务必使用 InnoDB;可通过 SHOW CREATE TABLE table_name; 查看 ENGINE 类型;
- 执行了隐式提交语句(如 ALTER TABLE、LOCK TABLES、CREATE INDEX 等),导致事务提前结束;
- 客户端连接异常断开,而 MySQL 的 autocommit=1 且未手动开启事务,所有操作已被自动提交。










