MySQL 事务
大约 2 分钟
1. 事务的特性
MySQL实现事务的4个特性分别如下:
- 原子性(Atomicity):一个事务的操作要么都成功要么都失败并回滚,通过 undo log(回滚日志) 保证
- 隔离性(Isolation):允许多个并发事务同时对数据进行修改,通过 MVCC(多版本并发控制) 保证
- 持久性(Durability):事务的修改是永久性的,通过 redo log(重做日志) 保证
- 一致性(Consistency):事务操作前和操作后,满足完整性约束,数据库保持一致性状态(比如转账,要增加和减少同样的金额)。通过原子+持久+隔离保证
2. 事务的隔离级别
2.2 隔离级别的实现方式
- 未提交读:直接读取最新的数据即可
- 提交读:每个语句执行前生成ReadView
- 可重复读:启动事务前生成ReadView
- 可串行化:加读写锁避免并行访问
2.3 Read View
在MySQL 存储结构的行格式中,提及了真实部分包含了部分与事务有关的隐藏列:
- trx_id:事务id,表示数据由哪个事务生成
- roll_pointer:记录上一个版本的指针,指向undo日志
在Read View中中包含四个字段:
- creator_trx_id:创建该Read View的事务的事务id
- m_ids:创建Read View时,当前数据库中活跃事务(开启了但未提交)的id列表
- min_trx_id:m_ids的最小值
- max_trx_id:创建事务时全局事务id最大值,也就是下一个事务的id
事务在访问记录时,会去检查记录中的字段:
- 当
trx_id < min_trx_id
,表示该记录是在创建Read View前提交的,记录对事务可见 - 当
trx_id >= max_trx_id
,表示该记录是在创建Read View后提交的,记录对事务不可见 - 当
min_trx_id <= trx_id < max_trx_id
,若trx_id
在m_ids
中,则代表事务未提交,记录对事务不可见;反之则可见