不准确,待更新
(因为MySQL通过使用next-key锁避免了幻读->RR级别,同一个事务的相同查询,可以得到两个不同的结果,文中的例子说明说服力还不够,可以先关闭MySQL的Gap锁)
很清楚的一个说明:
五分钟搞清楚MySQL事务隔离级别 @伞U
事务隔离级别:
未提交读(Read uncommitted),已提交读(Read committed),可重复读(Repeatable read),串行读(Serializable)。
MySQL支持的事务默认级别是可重复读,会出现幻读(插入+删除)的现象。
trans_id | start_time | overtime | status | cmt_rbk_time | memo |
---|---|---|---|---|---|
894809860158263330 | 1503902963 | 30 | 2 | 1503902963 | NULL |
MySQL 引擎选择InnoDB,一个表中的数据如上。
现在开启两个客户端,对表中的这条数据进行操作
客户端A和客户端B如下的SQL语句:
①start transaction;
②select * from trans_context;
③update trans_context set overtime = 31, cmt_rbk_time = cmt_rbk_time + 1 where cmt_rbk_time=1503902963;
④update trans_context set overtime = 32, cmt_rbk_time = cmt_rbk_time + 1 where cmt_rbk_time=1503902963;
⑤commit;
1.客户端A输入①开启一个事务,这时候读取数据库里的数据:
2.接着客户端B输入①开启一个事务,并且读取数据库里的数据,和客户端A读到的数据是一样的:
3.此时客户端A执行③更新语句,再通过②语句查询,查询结果如下,发现数据确实有了变化:
4.此时客户端B执行②查询语句,查询结果如下,在事务B中的数据没有变化,读取不到事务A中的更新:
5.此时在客户端B中执行更新语句,结果,并不能对这一行数据进行更新:
6.此时客户端A执行commit,提交成功,客户端B会同样做出反应,提示:
7.在客户端B中,再次用②查询数据,仍然是没有更新的语句:
8.客户端B提交commit后再次查询数据时,可以看到客户端A更新的数据了:
总结:MySQL默认的可重复读,在一个事务中,是无法读到别人未提交或已提交的更新数据。
当前会话可以重复读,每次读取的结果集都相同,而不管其他事务有没有提交。
幻读
幻读的问题 @jackbillow