为什么MySQL事务回滚不生效?含mysqli实现与phpMyAdmin测试场景
事务回滚未生效的原因
核心根因:表使用了不支持事务的存储引擎
- MySQL仅InnoDB、Cluster等具备事务能力的存储引擎,能实现事务的原子性语义:事务内的写操作只有在收到
COMMIT指令时才会永久落盘,收到ROLLBACK指令时会完全撤销之前的所有修改。 - 你操作的
User表如果是MyISAM、MEMORY这类无事务支持的存储引擎,所有写操作在执行完成后会立刻自动提交落盘,根本不会被外层事务包裹管控。哪怕你手动执行了START TRANSACTION、后续调用ROLLBACK,已经执行的UPDATE操作也无法被撤销,这和你观察到的「PHP代码里触发异常回滚、phpMyAdmin手动测试回滚都没撤销第一条UPDATE修改」的现象完全匹配。 - 验证方式很简单:执行
SHOW TABLE STATUS FROM 对应库名 WHERE Name = 'User',查看返回结果里的Engine字段值。如果显示为MyISAM,只需要执行ALTER TABLE User ENGINE = InnoDB把表转换为支持事务的引擎,回滚功能就会恢复正常。
其他可能导致同类问题的场景
- 事务执行过程中混入了会触发隐式提交的操作(比如
CREATE TABLE、ALTER TABLE、DROP TABLE这类DDL语句),这类语句会强制将当前未提交的事务直接持久化,后续的ROLLBACK无法撤销已经被隐式提交的修改。 - 数据库连接中途断开:事务内的写操作还没来得及回滚,连接被强制释放,MySQL会自动提交当前已执行的写操作。
内容的提问来源于stack exchange,提问作者Jens Stuber
相关产品推荐
相关产品推荐

