MySQL 的部分回滚操作主要包括以下四个核心步骤:
无实际动作的 binlog 回滚:
- 当执行回滚操作时,虽然 binlog 日志在 trx cache 中被标记为需要回滚,但此步骤并不会立即清除或真正修改这些日志。
- 这一步主要是为后续 InnoDB 回滚做准备,确保在 InnoDB 层回滚完成后,binlog 日志能够被正确地清理。
InnoDB 回滚:
- InnoDB 存储引擎会根据 undo 日志执行反向操作,逐步恢复事务影响的数据。
- 从最新的 undo 日志开始,逐条执行反向操作,包括记录的删除、更新等,直到回滚到指定的 savepoint。
提交 InnoDB 事务:
- 在 InnoDB 层完成回滚后,需要提交这个回滚操作作为一个事务来更新事务的执行状态。
- 这一步不同于普通的 commit 语句,因为回滚操作已经改变了数据,即使从逻辑上看数据恢复了原样,也需要将 InnoDB 中的修改正式提交。
清理 trx cache 中的临时 binlog:
- 在 InnoDB 事务提交完成后,trx cache 中的临时 binlog 日志会被清除。
- 这个过程涉及内存 buffer 和磁盘临时文件的清理,确保系统的整洁和后续操作的正确性。
总结:MySQL 的部分回滚操作是一个复杂但高效的过程,它依赖于 undo 日志和 binlog 日志的协同工作,通过 InnoDB 存储引擎的回滚机制和事务提交流程,实现了数据的精确恢复和事务状态的正确更新。