mysql 事务级别

mysql 数据四种事务级别:Read Uncommitted,Read Committed,Repeatable Read,Serializable

Read Uncommitted,Read Committed 这个两个就不多做介绍了
主要说明一下Repeatable Read 这个是mysql 默认的事务级别
此事务级别的表现为,可重读:此事务内的查询,不受其他事务的影响,会坚持从本事务内查询,因此,这个事务内的同一个查询(查询的数据不经过本事务的修改),会一直是一样的
如事务A,中有一个sql select * from A where id>3,假设表A中只有id 1.2.3.5 四条数据, 如果整个表中没有对表A中id>3的数据做修改,那么本事务内无论什么地方什么时候查询这个sql都是同样的结果,结果为 5 ,如果另外一个事务B,修改了表A中id>3的数据,如插入一条数据 id = 4,那么在事务A中依然会查出结果为5,不会查出4,这就是为什么叫可重复读,其实现在表中有5条数据,但是对于事务A而已,现在依然是4条数据,引发的这种错误叫幻读;

另外可重复读的另一个特性:GAP锁
在某范围行进行更新操作时,范围内的数据,不允许有新的数据插入或者修改,当然范围内的数据也不能更新,前提是此表有主键,如果事务A在
修改 id in (2,3,6),那么在事务A提交前,其他事务不能插入id = 4或者5的数据了,此操作和主键没有关系的,但凡是在行数据字段范围内的都会出现这个限制,这个就保证了,在此事务内未完成前范围内更新的数据不会出现差异,保证了范围数据的可重读,具体操作如下
[img]

[/img]
[img]

[/img]

第二个事务会一直block 一直到超时或者第一个事务完成,这个就是GAP锁的牛逼之处了

总之,可重复读事务中,对于同一个查询,在本事务不对查询结果做有妨害的事情,查询的数据一直是一样的,就是其他事物对数据进行了修改,另外GAP锁保平安

猜你喜欢

转载自ludizhang.iteye.com/blog/2324576