不同事务之间数据的可见性要结合事务的隔离性级别(不同隔离性创建视图的时机不同)、事务的读写锁(一致性读)进行判断。
注:以下是本人目前的理解,正确性有待验证,在这里先做一下记录
复习一下:
- 可重复读是在事务开始就建立视图,已提交读是在执行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