mysql可重复读现象及原理分析
mysql可重复读现象及原理分析
⼀、可重复读
我们先看看现象,再分析原理。我的版本是5.5。
下⾯是⼀张表,只有⼀条数据,并且我开启了事物
源码移码补码此时,另⼀个事物将record加1,因此我在开启⼀个命令⾏客户端,执⾏下⾯的命令:
成功加1之后,实际上,中record肯定是2。
然后回到之前的客户端,再查⼀次:
没⽑病,record还是1,果然是可重复读。有些⼈以为mysql的可重复读是通过⾏锁实现的,
从上⾯可以知道,肯定不是,如果是的话,第⼀次select * from test的时候,id=1的记录就会加⾏锁,我都加⾏锁了,我还没提交,另外的事物是怎么update成功的。
我们继续,我之前的第⼀个事物还没提交,不过提交之前,我也想加1;
表格滚动条设置
加完之后我再查⼀下,额,record是3,好像很奇怪,但也不奇怪。
elsevier是sci期刊吗其实,update test set record=record+1 where id=1;这条语句中,在加1之前,他知道⾃⼰等于2,然后2+1=3。
也就是说,update时读取数据是最新版本的数据,⽽select是到当前事物版本为⽌的数据。当更新成功
之后,当前版本即为最新版本,再次select,读取的是最新的数据。
在这⾥讨论下乐观锁的必要性。下⾯是乐观锁的实现,实现乐观锁,我们⼀般会这么做
update test set record=record+1 where id=1 and record=1;
如果不⽤乐观锁,你⽤select读取到的值其实根本不准确。除⾮你开启悲观锁,像下⾯这样:
select * from test where id=1 for update;mysql怎么读英语
这样可以读取到最新的内容,同时在你当前的事物提交之前,其他事物的update此条记录将会锁等待。
故事到此,还没有结束,此时我们开启事物三,也做加1操作看会发⽣什么。
苏州比较好的java培训机构结果是,锁等待超时,也就是说(事物⼀)在更新完后,会加⾏锁,这个应该⽐较好理解。事物中,刚开始查询的时候是不会加⾏锁的,但是当有更新操作之后,会加⾏锁,直到事物提交。
因为事务⼀还没有提交,所以事务三的select * from test;还只能查询到事务⼆提交的结果,也就是record是2
然后因为事务⼀中对id=1这条数据进⾏了修改,所以mysql⾃动将这条数据开启了⾏锁,在事务⼀提交之前,任何事务不可以修改id=1这条数据
本⽂转⾃:console线驱动

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。