事务隔离级别-学习

不准确,待更新

(因为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输入①开启一个事务,这时候读取数据库里的数据:


A1

2.接着客户端B输入①开启一个事务,并且读取数据库里的数据,和客户端A读到的数据是一样的:


B1

3.此时客户端A执行③更新语句,再通过②语句查询,查询结果如下,发现数据确实有了变化:
A2

4.此时客户端B执行②查询语句,查询结果如下,在事务B中的数据没有变化,读取不到事务A中的更新:


B2

5.此时在客户端B中执行更新语句,结果,并不能对这一行数据进行更新:
B3

6.此时客户端A执行commit,提交成功,客户端B会同样做出反应,提示:
B4

7.在客户端B中,再次用②查询数据,仍然是没有更新的语句:
B5

8.客户端B提交commit后再次查询数据时,可以看到客户端A更新的数据了:
B6

总结:MySQL默认的可重复读,在一个事务中,是无法读到别人未提交或已提交的更新数据。

当前会话可以重复读,每次读取的结果集都相同,而不管其他事务有没有提交。

幻读

幻读的问题 @jackbillow

幻读

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容