20160319184334938

 最近我在看mysql资料准备面试,看到过不少这类版本的图片,说RC事务隔离级别会有第二类更新丢失问题,RR却没有。

各种资料也会举一些类似下面的第二类更新丢失例子:

a 账户总共1000,事务1和事务2查询账户都是1000,然后事务1账户扣减100,提交。事务2扣减800提交。这时候账户余额为200,事务1扣减的100 会不翼而飞。

稍微深入学习一下之后我就发现,不对劲啊,RC和RR事务隔离级别好像挺类似的,感觉要么都会有第二类更新丢失问题,要么都没有啊。那么RR事务隔离级别是用什么独特的方案解决这个问题的呢。

我决定先自己去敲一遍sql看看,一敲就更蒙了,RC事务隔离级别根本重现不了第二类更新丢失。

RC事务隔离级别下的尝试重现第二类更新丢失操作

 如上图所示,左右两边都是RC事务隔离级别并开启事务,查询到初始值都是1700。如果RC事务隔离级别不能解决第二类更新丢失,那我左右两边各执行更新加100,右边先提交,那么左边的事务会覆盖右边的,最终值只加了100变1800。

但是实际右边提交后左边再提交,值最终会变为1900。

那RU事务隔离级别呢?

RU事务隔离级别下的尝试重现第二类更新丢失操作

 可以看到RU事务隔离级别也没有重现到第二类更新丢失。

我目前自己给出的一个推断就是:

那些面试资料提及的第二类更新丢失问题相关有误,RU、RC事务隔离级别不会有第二类更新丢失问题。或者说,只要更新语句会加排它锁,并且更新时的查询都是执行的当前读,那么就不会有第二类更新丢失问题。

希望有大佬能看到我的推断,指点一下我理解有误还是正确……

更多推荐