MySQL中InnoDB事务的执行过程
什么是事务
是一种逻辑的执行单元,执行的所有步骤要么全部成功,要么全部失败
比如转账操作,A给B转账100元,分2个步骤:
1.A余额减100
2.B余额加100
这2个操作步骤要么都成功,要么都失败。否则造成数据不一致问题
事务的特性:ACID
- 原子性(Atomicity)
操作要么全部成功,要么全部失败,不存在一部分成功一部分失败 - 一致性(Consistency)
事务执行前后,数据必须保持一致性状态
比如转账前后,金额总额是一致的 - 隔离性(Isolation)
每个事务相互独立,互不影响。
MySQL的隔离级别可以控制事务之间的隔离程度,如- 读未提交(Read Uncommitted)
- 读已提交(Read Committed)
- 可重复读(Repeatable Read)
- 串行化(Serializable)
- 持久性(Durability)
一旦事务提交成功,对数据库的修改应该永久保存,持久化存储,就算系统发生故障或者重启
事务执行过程
- 1.执行器按执行计划执行SQL
- 2.根据条件从磁盘数据页加载数据到缓冲池的缓存页
- 3.将旧数据写入 undo log,这一步用于发生异常时回滚数据
- 4.更新内存数据为新的值,并且标记缓存页为脏页
- 5.准备提交事务,将事务标记为 “准备提交” 状态
- 5.写入 redo log(第一阶段提交)
- 6.写入 binlog,这一步用于主从复制、数据恢复
- 7.将 binlog 的 commit 信息写入 redo log(第二阶段提交)
- 8.缓冲池中的脏页数据刷入磁盘
事务在最后的提交,分为两阶段进行提交:
逃避不一定躲得过,面对不一定最难过