文章目录

  • 隔离级别
  • 什么是可重复读
  • RR 实现方式
  • 总结


隔离级别

  1. 读未提交:别人改数据的事务尚未提交,我在我的事务中也能读到。
  2. 读已提交:别人改数据的事务已经提交,我在我的事务中才能读到。
  3. 可重复读:别人改数据的事务已经提交,我在我的事务中也不去读。
  4. 串行:我的事务尚未提交,别人就别想改数据。

这4种隔离级别,并行性能依次降低,安全性依次提高。

什么是可重复读

Repeatable Read (可重复读):保证在同一个事务中多次读取同样数据的结果是一样的。一个事务在执行过程中可以看到其他事务已经提交的新插入的记录(读已经提交的,其实是读早于本事务开始且已经提交的),但是不能看到其他事务对已有记录的更新(即晚于本事务开始的),并且该事务不要求与其他事务是“可串行化的”。

RR 实现方式

InnoDB在每行记录后面保存两个隐藏的列来,分别保存了这个行的创建时间和行的删除时间。这里存储的并不是实际的时间值,而是系统版本号,当数据被修改时,版本号加1
在读取事务开始时,系统会给当前读事务一个版本号,事务会读取版本号<=当前版本号的数据
此时如果其他写事务修改了这条数据,那么这条数据的版本号就会加1,从而比当前读事务的版本号高,读事务自然而然的就读不到更新后的数据了

总结

  1. InnoDB 的行数据有多个版本,每个版本都有row trx_id.
  2. 事务根据undo log 和 trx_id 构建出满足当前隔离级别的一致性视图
  3. 可重复读的核心是一致性读,而事务更新数据的时候,只能使用当前读,如果当前记录的行锁被其他事务占用,就需要进入锁等待。