MySQL不同事务中数据的可见性

不同事务之间数据的可见性要结合事务的隔离性级别(不同隔离性创建视图的时机不同)、事务的读写锁(一致性读)进行判断。

注:以下是本人目前的理解,正确性有待验证,在这里先做一下记录

复习一下:

  • 可重复读是在事务开始就建立视图,已提交读是在执行sql语句时才会建立视图;
  • 写锁是独占的,其他事务必须等占有写锁的事务提交后才能对数据进行读或者写;
  • 读锁共享,所有事务都可以同时读取数据。

接下来用下图解释数据可见性:
在这里插入图片描述
如果隔离级别是可重复读,那么在两个事务刚开始就需要建立一致性视图,而建立视图需要获得读锁,因为T1第一句sql占据的是K行的读锁,T2可以直接建立视图,里面K=2。

但如果T1第一句sql占据的是写锁,如下图
在这里插入图片描述
那么在T2要建立视图的时候T1占据了K行的写锁,所以要等T1提交完了,T2才能建立它的视图,最终T2视图里面K=2。

如果隔离级别是已提交读,那么事务都是在执行sql时才会建立一致性视图。分析过程同上,只不过是建立视图的时间点发生了变化。

总结一下:
多个事务要建立视图 -->要获取数据行的读锁 --> 可以获取,则当前事务与其他事务数据可见性无关 / 不能获取读锁,则当前事务的数据可见性与其他事务相关,需要等其他事务提交完毕获得最新的数据。

参考文章:

https://time.geekbang.org/column/article/70562

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值