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]http://dl2.iteye.com/upload/attachment/0120/2851/63368316-4336-37ae-a2ea-c986130f0c97.png[/img]
[/img]
[img]
[img]http://dl2.iteye.com/upload/attachment/0120/2853/6dc80510-0a2e-3534-b110-4374b8c7e9c2.png[/img]
[/img]
第二个事务会一直block 一直到超时或者第一个事务完成,这个就是GAP锁的牛逼之处了
总之,可重复读事务中,对于同一个查询,在本事务不对查询结果做有妨害的事情,查询的数据一直是一样的,就是其他事物对数据进行了修改,另外GAP锁保平安
InnoDB MySQL 事务管理 mysql事务管理级别
转载本文章为转载内容,我们尊重原作者对文章享有的著作权。如有内容错误或侵权问题,欢迎原作者联系我们进行内容更正或删除文章。
提问和评论都可以,用心的回复会被更多人看到
评论
发布评论
相关文章