简单整理一下mysql的隔离级别;
时间: 2016-10-06来源:OSCHINA
前景提要
「深度学习福利」大神带你进阶工程师,立即查看>>>
READ UNCOMMITTED
SELECT语句以非锁定方式被执行,但是一个可能更早期版本的记录会被用到。因此,使用这个隔离级别,比如,读是不连贯的。这也被称为“脏读”( dirty read)。另外,这个隔离级别象READ COMMITTED一样作用;简而言之,在READ UNCOMMITTED的隔离级别下,开启事物但事物并未提交之前,对于其他的事物都是可见的,记住,从性能的角度上来说,这个级别不见得比其他隔离级别的好;一般情况下非常少用,除非特殊业务需求;
READ COMMITTED
一个有些象Oracle的隔离级别。所有SELECT ... FOR UPDATE和SELECT ... LOCK IN SHARE MOD语句仅锁定索引记录,而不锁定记录前的间隙,因而允许随意紧挨着已锁定的记录插入新记录。 UPDATE和DELETE语句使用一个带唯一搜索条件的唯一的索引仅锁定找到的索引记录,而不包括记录前的间隙。在范围类型UPDATE和DELETE语句, InnoDB必须对范围覆盖的间隙设置next-key锁定或间隙锁定以及其它用户做的块插入。这是很必要的,因为要让MySQL复制和恢复起作用, “幽灵行”必须被阻止掉;简而言之,READ COMMITTED其实是解决了READ UNCOMMITTED的可重复读问题,即READ COMMITTED的隔离级别下,一个事物的开启到结束,它的所做的修改更新删除 对于其他事物而言都是不可见的;
REPEATABLE READ
这是InnoDB的默认隔离级别。带唯一搜索条件使用唯一索引的SELECT ... FOR UPDATE, SELECT ... LOCK INSHARE MODE, UPDATE 和DELETE语句只锁定找到的索引记录,而不锁定记录前的间隙。用其它搜索条件,这些操作采用next-key锁定,用next-key锁定或者间隙锁定锁住搜索的索引范围,并且阻止其它用户的新插入。在持续读中,有一个与之前隔离级别重要的差别:在这个级别,在同一事务内所有持续读读取由第一次读所确定的同一快照。这个惯例意味着如果你在同一事务内发出数个无格式SELECT语句,这些SELECT语句对相互之间也是持续的;REPEATABLE READ解决了恶心的脏读情况,保证同一个事务在读取同样的记录的时候能够保证结果一致性;但是却没能解决幻读的问题,就是当一个事务在读取一个记录的同时,另外一个事物又在对这个记录进行插入操作,导致事物再次读取的时候产生换行
SERIALIZABLE
这个级别类似REPEATABLE READ,但是所有无格式SELECT语句被 隐式转换成SELECT ... LOCK IN SHAREMODE。最高隔离级别,强制事务串行执行,可以说在对每个行数据加行锁,所以会导致很多锁的争用或者大量超时问题,性能很差,如果不是特殊的业务需求,一般不会选择这种情况;
附个图片(来自于高性能mysql):

科技资讯:

科技学院:

科技百科:

科技书籍:

网站大全:

软件大全:

热门排行