跳至主要內容

MySQL 事务

pptg大约 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_idm_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_idm_ids中,则代表事务未提交,记录对事务不可见;反之则可见