MySQL(一):基本原理
Innodb 是如何实现事务的
Innodb 通过 Buffer Pool,LogBuffer,Redo Log,Undo Log 来实现事务,以一个 update 语句为例:
- Innodb 在收到一个update语句后,会先根据条件找到数据所在的页,并将该页缓存在 Buffer Pool 中
- 执行 update 语句,修改 Buffer Pool 中的数据,也就是内存中的数据
- 针对 update 语句生成一个 RedoLog 对象,并存入 LogBuffer 中
- 针对 update 语句生成 undolog 日志,用于事务回滚
- 如果事务提交,那么则把 Redolog 对象进行持久化,后续还有其他机制将 Buffer Pool 中所修改的数据页持久化到磁盘中
- 如果事务回滚,则利用 undolog 日志进行回滚
零时刻导致 Flyway 执行失败
运行时,历史脚本中的 Flyway 失败,因为带有时间戳的脚本没有默认值。检查本地 MySQL 环境的 sql_mode,删除NO_ZERO_DATE
和NO_ZERO_IN_DATE
。
SELECT @@GLOBAL.sql_mode;
--- SET时移除NO_ZERO_DATE和NO_ZERO_IN_DATE
SET GLOBAL sql_mode = "ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION";