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查询语句,如果没有手动开启事务的话:
可重复读和读已提交,都可以正常读取到已经提交事务的结果的。两者在这种情况下时没有区别的。
问题已经解决:
变化时机:
如果select的语句开启了事务,当事务commit的时候,就会查询到最新的数据了。
如果select语句没有开启事务的话,下次查询就是最新的。