mysql事务仅innodb引擎支持,myisam不支持;默认autocommit=on,每条dml独立提交,需set autocommit=0并显式start transaction、commit/rollback才能实现原子操作。

MySQL事务不是“可选功能”,而是数据一致性的底线保障——它只在InnoDB引擎下有效,MyISAM等引擎开启START TRANSACTION也毫无作用。
为什么INSERT/UPDATE没报错却没生效?
默认情况下MySQL是自动提交(autocommit=ON),每条DML语句都单独成一个事务。你以为自己在写一组逻辑,其实数据库早已逐条提交。一旦中间出错,前面已提交的语句无法回滚。
- 执行
SELECT @@autocommit;确认当前值是否为1(即ON) - 若需手动控制,先运行
SET autocommit = 0;,之后所有DML都会暂存在当前事务中 - 注意:
autocommit是会话级变量,只影响当前连接,不影响其他客户端 - DDL语句(如
CREATE TABLE、ALTER TABLE)会强制触发COMMIT,哪怕在事务块内也不行
START TRANSACTION和BEGIN有区别吗?
没有本质区别,BEGIN是START TRANSACTION的同义词,二者完全等价。但BEGIN容易和存储过程中的BEGIN...END块混淆,建议统一用START TRANSACTION。
- 事务必须显式以
COMMIT结束才算真正落地;不提交,连接断开时会自动ROLLBACK -
ROLLBACK只能撤销当前未提交的变更,不能回退已COMMIT的数据 - 事务中执行
SELECT看到的是本事务开始时的一致快照(取决于隔离级别),不是实时最新值
为什么ROLLBACK后数据还是变了?
常见于误用了非事务型引擎。执行SHOW ENGINES;检查表引擎,如果显示Support列为NO或DISABLED,说明该引擎不支持事务。
- 确认表引擎:
SHOW CREATE TABLE account;,看ENGINE=InnoDB是否出现 - 建表时务必显式指定:
CREATE TABLE t (...) ENGINE=InnoDB;,别依赖默认值 - MyISAM表执行
ROLLBACK无任何效果,也不会报错,静默失败 - 即使整个库默认引擎是InnoDB,单张表仍可能被创建为MyISAM(尤其从旧备份恢复时)
事务真正的复杂点不在语法,而在于隔离级别的选择和MVCC行为的理解——比如REPEATABLE READ下两次SELECT结果相同,不代表没发生幻读;READ COMMITTED看似安全,但在高并发更新场景下可能引发不可重复读。这些细节不结合具体业务读写模式去验证,光记命令没用。











