InnoDB是MySQL 5.5+默认且唯一推荐的事务引擎,因其支持行级锁、MVCC、外键和完整ACID;MyISAM仅支持表级锁、无事务、易丢数据,混用或误用将引发线上事故。
MySQL 的存储引擎不是可有可无的插件,而是直接决定你能不能用事务、数据会不会丢、并发读写是否安全的核心组件。选错引擎,InnoDB 和 MyISAM 表混用,或者误以为“开了事务就一定原子”,都是线上事故常见起点。
为什么 InnoDB 是默认且几乎唯一推荐的事务引擎
InnoDB 是 MySQL 5.5+ 默认引擎,它把索引和数据一起存(聚簇索引),支持行级锁、MVCC、外键和完整的 ACID 实现。而 MyISAM 只支持表级锁、无事务、崩溃后容易坏表——哪怕只是断电,也可能丢失最后几条 INSERT 的数据。
-
MyISAM的AUTO_INCREMENT是表级缓存,高并发插入可能卡住;InnoDB是行级 + 意向锁,冲突更少 -
InnoDB的REPLACE INTO或INSERT ... ON DUPLICATE KEY UPDATE能安全处理重复键,MyISAM在此场景下可能触发非预期的删除+插入顺序 - 即使只读场景,也别迷信
MyISAM更快:现代 SSD + 缓存下,InnoDB的随机读性能差距极小,且避免了修复表(REPAIR TABLE)这种运维黑洞
BEGIN / START TRANSACTION 后,什么才算真正开启一个事务
事务不是靠语句开头几个字就生效的,它受 autocommit 状态和存储引擎双重约束。执行 BEGIN 本身不启动事务,只是把当前会话的 autocommit 设为 0;如果连的表是 MyISAM,哪怕写了 COMMIT,也不会回滚任何东西。