mysql 可重复读隔离级别底层实现

隔离级别

  1. 读未提交:别人改数据的事务尚未提交,我在我的事务中也能读到。

  2. 读已提交:别人改数据的事务已经提交,我在我的事务中才能读到。

  3. 可重复读:别人改数据的事务已经提交,我在我的事务中也不去读。

  4. 串行:我的事务尚未提交,别人就别想改数据。

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

什么是可重复读

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

RR 实现方式

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

总结

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值