MySQL如何确保ACID特性(原子性、一致性、隔离性、持久性)的实现?
- 内容介绍
- 文章标签
- 相关推荐
本文共计1088个文字,预计阅读时间需要5分钟。
MySQL 的 ACID 并不是依靠一句 `START TRANSACTION` 就自动生效的,它依赖于 InnoDB 存储引擎底层的日志与锁机制协同工作。MyISAM 等引擎基本不支持事务,因此第一步必须确认使用的是 `InnoDB`。
原子性靠 undo log 回滚日志实现
事务执行过程中,每条 INSERT/UPDATE/DELETE 操作前,InnoDB 都会把原始数据(或逻辑前像)写入 undo log。一旦事务中途失败或显式调用 ROLLBACK,系统就按这条日志“倒带”恢复——不是删记录,而是把旧值重新填回去。
-
undo log在事务开始时分配段(segment),写入速度比直接改数据页快,且先落盘(受innodb_flush_log_at_trx_commit影响) - 注意:
SELECT不生成undo log,只有 DML 才触发 - 长事务会阻碍
undo log回收,导致ibdata1文件膨胀,这是线上容易被忽略的磁盘隐患
持久性靠 redo log 重做日志保证
事务提交(COMMIT)时,InnoDB 并不立即将变更刷进表空间文件(.ibd),而是先把修改操作记到 redo log 中,并按配置策略强制刷盘。崩溃重启后,MySQL 会重放这些日志,把未写入数据文件的已提交事务补全。
本文共计1088个文字,预计阅读时间需要5分钟。
MySQL 的 ACID 并不是依靠一句 `START TRANSACTION` 就自动生效的,它依赖于 InnoDB 存储引擎底层的日志与锁机制协同工作。MyISAM 等引擎基本不支持事务,因此第一步必须确认使用的是 `InnoDB`。
原子性靠 undo log 回滚日志实现
事务执行过程中,每条 INSERT/UPDATE/DELETE 操作前,InnoDB 都会把原始数据(或逻辑前像)写入 undo log。一旦事务中途失败或显式调用 ROLLBACK,系统就按这条日志“倒带”恢复——不是删记录,而是把旧值重新填回去。
-
undo log在事务开始时分配段(segment),写入速度比直接改数据页快,且先落盘(受innodb_flush_log_at_trx_commit影响) - 注意:
SELECT不生成undo log,只有 DML 才触发 - 长事务会阻碍
undo log回收,导致ibdata1文件膨胀,这是线上容易被忽略的磁盘隐患
持久性靠 redo log 重做日志保证
事务提交(COMMIT)时,InnoDB 并不立即将变更刷进表空间文件(.ibd),而是先把修改操作记到 redo log 中,并按配置策略强制刷盘。崩溃重启后,MySQL 会重放这些日志,把未写入数据文件的已提交事务补全。

