码迷,mamicode.com
首页 > 数据库 > 详细

MYSQL-InnoDB事务隔离级别

时间:2015-09-11 16:12:32      阅读:229      评论:0      收藏:0      [点我收藏+]

标签:

关于这四个隔离级别的介绍:

  • 未提交读(READ UNCOMMITTED)。另一个事务修改了数据,但尚未提交,而本事务中的SELECT会读到这些未被提交的数据(脏读)。

  • 提交读(READ COMMITTED)。本事务读取到的是最新的数据(其他事务提交后的)。问题是,在同一个事务里,前后两次相同的SELECT会读到不同的结果(不重复读)。

  • 可重复读(REPEATABLE READ)。在同一个事务里,SELECT的结果是事务开始时时间点的状态,因此,同样的SELECT操作读到的结果会是一致的。但是,会有幻读现象(稍后解释)。

  • 串行化(SERIALIZABLE)。读操作会隐式获取共享锁,可以保证不同事务间的互斥。


这四个级别逐渐增强,每个级别解决一个问题

  • 脏读,最容易理解。另一个事务修改了数据,但尚未提交,而本事务中的SELECT会读到这些未被提交的数据。

  • 不重复读。解决了脏读后,会遇到,同一个事务执行过程中,另外一个事务提交了新数据,因此本事务先后两次读到的数据结果会不一致。

  • 幻读。解决了不重复读,保证了同一个事务里,查询的结果都是事务开始时的状态(一致性)。但是,如果另一个事务同时提交了新数据,本事务再更新时,就会“惊奇的”发现了这些新数据,貌似之前读到的数据是“鬼影”一样的幻觉。


还是通过测试结果来说明这些问题吧,以下结果基于mysql的版本是 5.1.53。


READ UNCOMMITTED

 SessionA                                                                                

技术分享

 SessionB

技术分享

ps:从结果可知,在sessionA还没有commit的时候,SessionB就已经可以读取到update的数据,尽管没有commit.这就会导致“脏读".


READ-COMMITTED

技术分享技术分享


ps:sessionA只有提交之后,sessionB才可以读取update的数据,这就避免了‘脏读‘,但是还是存在问题,那就是不可重复读。sessionB在同一个事务中,两次读取的数据不一致。


REPEATABLE READ

技术分享技术分享


ps: 通过设置可重复读隔离级别,解决了同一个事务中多次读取数据不一致的问题,

但是还是存在问题,那就是‘幻读‘, 举例说明,事务A在insert之前发现表里面没有数据,于是就准备insert数据,与此同时,事务B insert数据到表里面并且已经commit.

这个时候事务A继续insert, 如果某个字段有唯一约束,则insert的时候冲突。



SERIALIZABLE


技术分享技术分享

ps:这个就解决了幻读的问题,但是影响了并发读写性能,sessionA获得了共享锁,sessoinB是挂起的状态,只有sessionA commit之后,sessionB才可以update(不超时的前提下)。

MYSQL-InnoDB事务隔离级别

标签:

原文地址:http://my.oschina.net/u/617909/blog/504991

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!