向大家问好,
最近,我尝试了下面发布的方案,我希望您对此有意见。使用MySQL/INNODB,在表t (a,b,c,d)值(10,20,30,40)上,我们让这两个事务(A和B)按下面指定的顺序执行:
1) A、B:设置autocommit=0;
2)B:设置事务隔离级别可重复读;
3)B:从t中选择d;
4)A:更新t集a=a+3;
5)A:提交;
6)B select * from t;
从(6)返回的值是(10,20,30,40),好像(3)上的列d的选择导致在事务B上创建本地快照,并且由于B具有可重复读取,因此它保持一致的值。这是真的吗,还是有另一种解释?
提前感谢您的帮助。
发布于 2016-05-02 15:04:06
是的,在这种情况下,MySQL似乎会自动启动事务:
假设您在缺省的可重复读隔离级别下运行。当您发出一致的读取(即普通的SELECT语句)时,InnoDB将为您的事务提供一个时间点,根据该时间点,您的查询将看到数据库。
…
您可以通过提交事务,然后使用一致的快照执行另一个SELECT或START事务来提前时间点。
https://dev.mysql.com/doc/refman/5.7/en/innodb-consistent-read.html
尤其是最后一句话听起来像是下一个SELECT将自动创建一个新事务。(它还说明了如何继续前进:commit或rollback,但我猜您已经知道这一点。)
https://stackoverflow.com/questions/36969738
复制相似问题