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表的修改锁(即只能进行查询)