MyISAM 不支持事务,因缺失 undo log、redo log、行级锁和 MVCC,BEGIN/ROLLBACK 仅被语法接受而引擎忽略;ENGINE=MyISAM 即放弃 ACID,@Transactional 等均无效。

MyISAM 执行 BEGIN/ROLLBACK 为什么没反应
因为 MyISAM 引擎压根没实现事务所需的底层组件,BEGIN 和 ROLLBACK 对它来说只是合法语法,MySQL Server 层会接收,但引擎层直接忽略。你看到“执行成功”,其实是假象。
- 没有
undo log:无法记录修改前状态,ROLLBACK没东西可倒带 - 没有
redo log:崩溃后未刷盘的写入无法恢复,持久性(D)彻底失效 - 只有表级锁:不支持行级并发控制,也无
MVCC,隔离性(I)无从谈起 - 不跟踪事务状态:引擎内部没有“当前在哪个事务里”这种上下文,自然无法响应
COMMIT
SHOW CREATE TABLE 显示 ENGINE=MyISAM 就等于放弃 ACID
只要建表语句或 ALTER TABLE 指定了 ENGINE=MyISAM,这张表就与 ACID 无关——哪怕你用的是 MySQL 8.4,哪怕 autocommit=0,哪怕 ORM 加了 @Transactional 注解,都无效。
-
SELECT @@default_storage_engine;只影响新表默认引擎,不改变已有表行为 -
SHOW CREATE TABLE your_table;是唯一可靠确认方式,别信SHOW TABLE STATUS的 Engine 字段(偶尔缓存不准) - Spring Boot 中
@Transactional失效的常见原因:表是 MyISAM,或事务传播配置不当导致跨连接
InnoDB 的 ACID 不是“开个开关”,而是四件套咬合运行
ACID 不是单个模块提供的能力,而是 undo log、redo log、行级锁 + next-key lock、MVCC 四者协同的结果。缺一不可,改掉任意一个关键配置,ACID 就塌一角。
- 关掉
innodb_doublewrite=OFF:部分页写失败时可能损坏数据页,一致性(C)和持久性(D)同时崩 - 设
innodb_flush_log_at_trx_commit=0:提交后崩溃可能丢 1 秒数据,D 失效 - SQL 未命中索引(如
WHERE name LIKE '%a'):行锁退化为表锁,隔离性(I)和并发性双降 -
FOREIGN KEY约束被禁用:一致性(C)失去数据库层兜底,全靠应用逻辑硬扛
DDL 语句在事务里会“突然提交”,MyISAM 用户更容易踩坑
哪怕你在 BEGIN 后执行 ALTER TABLE ... ENGINE=InnoDB,这条 DDL 也会触发隐式提交——前面所有 DML(比如 UPDATE)立刻落盘,ROLLBACK 已经救不回来。
- MyISAM 用户常误以为“改完引擎就能回滚”,其实改引擎本身已是不可逆操作
-
TRUNCATE TABLE、DROP TABLE、CREATE INDEX同样触发隐式提交,和引擎类型无关 - 安全删数据必须用
DELETE FROM,且确保autocommit=0,且整条语句链中没混入任何 DDL
DECLARE EXIT HANDLER,都会让 ACID 在你没察觉时就已失效。


















