引言
大家在面试中一定碰到过
说说事务的隔离级别吧?
老实说,事务隔离级别这个问题,无论是校招还是社招,面试官都爱问!然而目前网上很多文章,说句实在话啊,我看了后我都怀疑作者弄懂没!因为他们对可重复读(Repeatable Read)和串行化(serializable)的解析实在是看的我一头雾水!
再加上很多书都说可重复读解决了幻读问题,比如《mysql技术内幕--innodb存储引擎》等,不一一列举了,因此网上关于事务隔离级别的文章大多是有问题的,所以再开一文说明!
本文所讲大部分内容,皆有官网作为佐证,因此对本文内容你可以看完后,你完全可以当概念记在脑海里,除非官网的开发手册是错的,否则应当无误!
另外,本文会重点说一下
可重复读(Repeatable Read)是否真的解决幻读的问题!
正文
开始我先提一下,根据事务的隔离级别不同,会有三种情况发生。即脏读、不可重复读、幻读。这里我先不提这三种情况的定义,后面在讲隔离级别的时候会补上。
这里,大家记住一点,根据脏读、不可重复读、幻读定义来看(自己总结,官网没有),有如下包含关系:
那么,这张图怎么理解呢?
即,如果发生了脏读,那么不可重复读和幻读是一定发生的。因为拿脏读的现象,用不可重复读,幻读的定义也能解释的通。但是反过来,拿不可重复读的现象,用脏读的定义就不一定解释的通了!
假设有表tx_tb如下,pId为主键
pId | name |
---|---|
1 | zhangsan |
1、读未提交(READ_UNCOMMITTED)
其实这个从隔离名字就可以看出来,一个事务可以读到另一个事务未提交的数据!为了便于说明,我简单的画图说明!
如图所示,一个事务检索的数据被另一个未提交的事务给修改了。
官网对脏读定义的地址为
https://dev.mysql.com/doc/refman/5.7/en/glossary.html#glos_dirty_read
其内容为
**dirty read
An operation that retrieves unreliable data, data that was updated by another transaction but not yet committed.
**
翻译过来就是
检索操作出来的数据是不可靠的,是可以被另一个未提交的事务修改的!
你会发现,我们的演示结果和官网对脏读的定义一致。根据我们最开始的推理,如果存在脏读,那么不可重复读和幻读一定是存在的。
新闻热点
疑难解答