mysql脏读解决方案_mysql读取数据是快照读,不加锁,那RR的防止脏读幻读是如何实现的?...

说说我的理解:innordb中RR隔离级别下,系统有个版本号,每次开启一个事物的时候版本号会自增一个。插入,修改,删除的每条记录会保存当前系统的版本号并把操作之前的数据保存到undo log 当中。 非锁定读 当某条事物中执行第一个读取的操作的时候,系统会生成一个快照,也就是当前系统的版本号,读取的时候也是识别锁的,当读到某条被锁定的数据,如果是本事物的锁就直接读取,如果不是会去读取undo log当中版本号小于等于快照版本号的数据,未提交的新增或者修改的数据是有排它锁的,因此不会读到,这就防止了脏读,在没进行第一次读操作的时候是可以读到当前事物开始之后其它事物提交的数据的,第一次读取操作以后,接下来读取的操作读到的都是和第一次一样的那个快照,要么是本事物生成的数据,可以避免部分幻读。

但是还是有些情况下还是会导致幻读的:

下面是我做的一个实验:

初始元素数据表如图:

开启事物1 将id为4的那条记录的武汉改成wuhan:

开启事物2:

此时事物2中查询不到事物1中的修改。

事物1提交:

此时事物2中任然看不到事物1中的修改

接下来在事物2中修改id为4的记录中的湖北改为hubei,结果发现武汉,湖北都被改成拼音了

(这应该也算是幻读吧,在事物2中第一次读取id为4的记录中state是湖北,期间在事物2中将id为4的记录中将武汉改为了wuhan没有动湖北,第二次读的时候却发现湖北被改成hubei了)

第一次回答,接受各种形式的批评指正。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值