前言:看了很多关于MySQL隔离级别的视频和文章,发现了一个问题,大家都是说,不可重复读是在一个事务中读到了另一个事务提交后修改后的数据,而幻读是一个事务读到了另一个事务中添加并提交后的数据。那么删除数据是属于不可重复读还是幻读?
那么重点来了,很少有人说,另一个事务将数据删除提交后,在原事务中能否读到删除后的数据,而这个是属于不可重复读问题,还是属于幻读问题。(看之前请先了解事务相关的知识)
针对这个问题,我发现很多人都没有去深入思考,也没有去实践,就直接复制别人的文章然后发博客了,这是非常不负责任的做法,特别是一些粉丝较多的博主,容易误导别人。
网上大部分的文章,都是演示插入数据后,另一个事务不能再插入数据,而很少有人会将删除数据的演示展示出来,这也是我很不理解的一个地方。
注:这是我自己在学习过程中的理解,以及根据实际演示来得出的结论,不能保证完全正确(环境mysql5.6)
下面是用来演示的一个数据表:
两个mysql服务(用左和右区分),隔离级别都为可重复度
首先演示可重复读解决不可重复读问题,左右两别分别开启事务,然后右边修改 id 为2的 balance 为 300;并提交事务,可以看到是左边中是读不到右边中修改的值的,解决了修改的不可重复读问题;但是不知道为什么,有时候会出现不可重复读问题,不知道是不是因为我mysql版本的问题,这个以后再研究,失败的图为第二张。
成功图:左边在事务结束之前没有读到右边修改提交的值
失败图如下:
演示新增的幻读问题,可重复度会出现这个情况,在右边添加一条记录(3,“cc”,400)
正常情况:虽然在左边没有读到右边新增提交的记录,但是当我们去插入id相同的数据时,显示主键重复,意思就是实际上这条记录已经存在了,这就发生了幻读。
不正常情况:我也不知道为什么演示的时候总是出现不同的情况,第二种情况是直接读到了不同的数据,暂且也把它当一种幻读情况吧
演示删除时会出现的情况,删除id 为3 的记录。
正常情况:我们发现右边的删除提交后的并没有影响左边的数据,特意在左边用了一条更新语句证明该记录在左边事务中还存在,和插入数据是不一样的
不成功示例:我们会发现删除元素后立马就读到了这个数据。
我们可以看到,在右边事务删除数据并提交时,左边事务并没有受到影响,所以可以认为可重复度解决了该问题,所以 删除和修改 应该都是属于不可重复读,而只有 新增 才是属于幻读。
(也可以加入锁的理解,锁住的是操作的那条记录,我们可以对他进行修改和删除,而不能保证其他数据的插入)
以上这是我个人目前的一个理解,可能随着知识的不断增长会有新的理解,以及不知道为什么我的mysql总是在操作时出现不同的结果,欢迎大家留言讨论。