mysql默认事物隔离级别实践

mysql默认的事物隔离级别为重复读。故我们在使用mysql数据库进行开发项目时,要留意其隔离等级,避免数据库中出现脏数据,特别是高并发的时候。后边博文会介绍我在项目中遇见关于事物级别引起的问题。

服务器版本:



 

现在开两个console,并且开启事物。A,B都各自查询表word_mood的数据,展示数据如下:


 

==========================================================
 

 

B客户端对message_id=5的数据进行修改,A客户端再次查询数据:

=================================================

这时候我们发现B客户端已经给message_id等于5的message_content加1了,但是A客户端的message_id等于5的message_content依旧显示为5。可能有人会提出,因为B没有提交事物,当然A还是显示5。是否是因为这个原因呢。那我们再测试下就明白了。


 

===============================================================================
 

大家看,这时候B提交了事物,但是A查询依旧是5,没有任何改变。可能这是又有同学提出是不是B没有修改成功,所以A始终显示的是5呢。那我们继续测试:


大家看结果,说明B客户端确实修改了message_id=5的数据。那为什么A客户端没有显示出来呢。这时候我们就要引申出mysql的默认隔离事物了,可重复读。

可重复读的意思就是在开启一个事物的a对一张表T进行查询操作的时候,若另外一个事物b也在对T做修改操作,无论b对T进行什么操作,a的查询结果都一致,直到a,b事物提交,然后再次查询才能显示出b对t的操作。

那么又会有同学问,若A对T进行修改操作,此时A不提交事物,B是否也能对T进行修改操作呢?我们继续测试:

此时A,B客户端对message_id=5的message_content进行加1操作:


 

=======================================================================================
 

 

这时候我们发现当A客户端没有提交事物,B客户端再去修改的时候就会报获取锁超时。说明在mysql默认的事物级别下,当一个事物对T进行修改操作的时候,其他事物只具有查询权限。

总结:mysql的默认级别可重复读指的是,(1)当A事物对表T进行读取操作,无论其他事物对T进行何种操作,A的读取结果都一样(即在A事物开启前,时间最近已经完成的事物对T的操作)。(2)当A事物对T表进行非读取操作时,其他事物获取不到对T表的修改锁(即只能进行查询)

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值