mysql mvcc在可重复读的隔离级别下,怎么更新select的结果集的?更新策略或机制是什么?--已经弄明白了

中凯_凯哥java 发布于 10/24 20:10
阅读 127
收藏 0

【Gopher China万字分享】华为云的Go语言云原生实战经验!>>>

mysql的mvcc策略明白了,隔离级别是读已提交或可重复读的级别下使用的。有个疑问:

在读已提交的时候,sessionA在第一次查询的时候版本号是100,查询结果name=凯哥Java,此时sessionB更新了name为:公众号凯哥Java,但是事务没有提交。此时,sessionA查询的结果name值不变。如果sessionB提交了事务后版本号变成了150,sessionA再次查询后,查询出的name就是sessionB修改后的值。即name=公众号凯哥Java。这个是应该sessionA再次执行查询的时候,发现版本号变化了, 如果你是已提交读隔离级别,这时候你会重新生成一个ReadView 。所以能查询到更新后的值。可以理解

但是如果你是可重复读隔离级别,这时候你的ReadView还是第一次select时候生成的ReadView 。sessionA再次查询后的name不变。即name=凯哥Java(注意:此时sessionB已经提交了事务)。那么问题来了:再可重复读的隔离级别下,sessionA查询什么时候name值会变成最新的(假设sessionA一直不超时,不执行install、update、delete这样的操作。一直是查询操作)?变成最新的机制或者策略或者时机是什么时候?

-------------------------------------------------------------------------------

当mysql的隔离级别是可重复读的时候,select语句什么时候查询是最新的数据?分情况:

1:如果select语句手动开启了事务,那么,查询最新的结果是在sessionA的事务提交(也即是select手动开启事务,手动提交事务)之后,在执行select语句,就是查询到最新的;

2:如果没有手动开启事务的话,再次执行select,就会查询到最新的。

可重复读和读已提交的区别:

select查询语句如果手动开启了事务:

可重复读情况:就算新session提交了事务,select的结果不会变化的。手动commit后,在执行select查询结果就会是最新的;

读已提交情况:新session提交了事务后,select的结果会变化的。就算没有commit,依然可以查询到最新的已经提交的结果。

select查询语句,如果没有手动开启事务的话:

可重复读和读已提交,都可以正常读取到已经提交事务的结果的。两者在这种情况下时没有区别的。

加载中
0
中凯_凯哥java
中凯_凯哥java

问题已经解决:

变化时机:

如果select的语句开启了事务,当事务commit的时候,就会查询到最新的数据了。

如果select语句没有开启事务的话,下次查询就是最新的。

中凯_凯哥java
中凯_凯哥java
回复 @伙哥 : 嗯嗯。是的。在做实验的时候,select开启了事务,然后就突然好奇,什么时候获取最新的。如果select的事务一直不提交,当然获取不到最新的。
伙哥
伙哥
其实答案也简单,就是在一个事务中,就是看不到最新值,除非用当前读
OSCHINA
登录后可查看更多优质内容
返回顶部
顶部