mysql的mvcc策略明白了,隔离级别是读已提交或可重复读的级别下使用的。有个疑问:
在读已提交的时候,sessionA在第一次查询的时候版本号是100,查询结果name=凯哥Java,此时sessionB更新了name为:公众号凯哥Java,但是事务没有提交。此时,sessionA查询的结果n
Mysql的mvcc策略理解隔离级别用于提交读取或可重复读取的级别。有一个问题:
阅读提交时,第一次查询sessionA的版本号是100,查询结果是name= Kaige Java。此时sessionB更新名称为:微信官方账号凯歌Java,交易未提交。此时,会话查询结果的名称值保持不变。如果sessionB提交事务后版本号变为150,那么查询的名称就是sessionA再次查询后sessionB的修改值。即name=微信官方账号凯歌Java。这时sessionA再次执行查询,发现版本号已经改变。如果您已经提交了读隔离级别,此时您将重新生成一个读视图。因此,可以查询更新后的值。可以理解,
但是,如果您处于可重复读取隔离级别,那么您的读取视图仍然是第一次选择时生成的读取视图。会话后名称保持不变再次查询。即name= kaige Java(注意:此时sessionB已经提交了事务)。那么问题来了:在可重复读取的隔离级别下,sessionA查询中的名称值什么时候变成最新的(假设sessionA从不超时,不执行安装、更新、删除等操作)。一直是查询操作)?最新的机制或策略或机会是什么时候?
-
当mysql的隔离级别可重复时,select语句什么时候查询最新数据?子情况:
1:如果select语句手工打开事务,那么查询的最新结果是sessionA的事务提交(即select手工打开事务,手工提交事务)后,执行select语句,得到最新的查询;
2:如果不是手动打开交易,再次执行选择,会找到最新的交易。
重复阅读和提交阅读的区别:
如果交易是手工打开的,请选择查询语句:
可重复读取:即使新会话提交了事务,select的结果也不会改变。手动提交后,选择查询的结果将是最新的;
已读提交状态:新的进程提交事务后,选择的结果将发生变化。即使没有提交,您仍然可以查询最新提交的结果。
选择查询语句,如果交易不是手工打开的:
重复读取和读取提交通常可以读取提交事务的结果。在这种情况下,两者没有区别。
中凯_凯哥java
问题已经解决:
变化时机:
如果select的语句开启了事务,当事务commit的时候,就会查询到最新的数据了。
如果select语句没有开启事务的话,下次查询就是最新的。