隔离是ACID(Atomicity,Consistency,Isolation,Durability)的重要部分,它保证事务以一种可靠的方式运行。隔离确保同时运行的事务并不相互干扰。隔离确保数据一致性。如果事务不被隔离,那么一个事务在修改数据,而另一个事务正在读取,因此导致数据的不一致。

既然我们已经理解事务是什么。那么让我们开始理解隔离级别。隔离级别决定事务间怎么相互隔离,可能是没有任何隔离,也可能是最大级别的隔离。选择隔离级别依赖于你的应用需求。但是首先你必须理解各种隔离级别,这样才能更好的选择最合适的隔离级别。

InnoDB支持四个标准的SQL隔离级别。下面做介绍:

READ UNCOMMITTED

当设置这种隔离级别时,在事务之间并不存在任何隔离。一个事务可以看到另一个事务还没有commit的修改数据。意味着事务可以读取到最终不存在的数据,因为修改数据的事务可能会回滚修改,并不commit。这就是所谓的dirty read。事实上,这种级别的隔离不能叫做隔离。导致这种级别的隔离的应用不能叫做事务型系统。

READ COMMITTED

如果设置这种隔离级别,dirty read的现象可以避免。因为任何uncommitted的修改并不能被其他事务所看到,直到修改被提交。设置这种隔离级别,每个select会使用这个select执行之前所用committed的数据所形成的快照。因为每个select有自己的快照,所以会导致在同一个事务中,执行同一个select查询时,会产生不同的结果集。这种现象叫做non-repeatable read。

REPEATABLE READ

如果设置这种隔离级别,non-repeatable read的现象可以避免。这种隔离级别,会在同一个事务中,执行多次同一个select查询会产生相同的结果集。在一个事务中,一个select的快照会在第一个这个select执行时形成。在一个事务中,相同的select会使用相同的快照。这个级别的事务并不会关心其他事务对数据所做的修改,不管修改的数据是否已经committed。这样确保读取数据保持一致性。这种隔离级别是InnoDB的默认设置。尽管这种隔离级别解决non-repeatable read的问题。但是会引起另一个问题,那就是phantom reads

SERIALIZABLE

如果设置这种隔离级别,phantom reads的现象可以避免。在这个级别的事务会放locks到它所访问的记录上,并锁住资源,以至于这些记录不能被操作。这种级别的隔离是最强的隔离级别。

注意事项:

SERIALIZABLE的隔离级别最好避免使用

因为SERIALIZABLE隔离级别仅仅能帮你解决phantom reads问题,否则SERIALIZABLE和REPEATABLE-READ是一样的。InnoDB有一个特殊的locking特性,叫做gap-locking,它会帮你避免phantom reads问题。以gap locking为例,一个lock会在设置在index records记录间隙。你就可以通过使用FOR UPDATE或者LOCK IN SHARE MODE方式来避免phamtom reads问题

Locking和隔离级别

READ-UNCOMMITTED隔离级别拥有最少的locking,而READ-COMMITTED隔离级别会移除大量的gap-locking,因此会产生更少的deadlocks。REPEATABLE-READ相对READ-COMMITTED来说,有更高级别的locking。SERIALIZABLE拥有最高级别的locking,所有简单的selects会自动转成select ... lock in share mode,因此所有记录都是共享锁。

复制和隔离级别

在MySQL中默认的复制是基于statement复制。这种复制类型复制数据修改是通过重新执行SQL statements在所有slaves的节点上。这需要隔离级别更严格。以至于数据修改保持一致性。正如上面所提到的。READ-COMMITTED会引起non-repeatable read。因此它并不是安全的statement-based复制。因此当使用statement-based read,使用SERIALIZABLE或者REPEATABLE-READ隔离级别。如果你在使用MySQL版本5.1以上(包含),那么你可以使用READ-COMMITTED,基于行的复制。因为基于行的复制。你可以明确知道每一行的数据的变化。

性能和隔离级别

SERIALIZABLE和REPEATABLE-READ拥有更多的locking,因此可能产生更多的deadlock,也会降低性能。事实上,SERIALIZABLE是隔离级别中最差的,因为它会转换plain read到locking reads。就locking和deadlocks而言,REPEATABLE-READ会好一点。但是READ-COMMITTED更好,因为有更少的gap-locks。但是locking和deadlocks并不是唯一影响性能的。有很多因素需要考虑。

结论:

通常READ-COMMITTED和REPEATABLE-READ是两种可供选择的隔离级别。选择主要依赖于你的应用。

理解InnoDB的事务隔离级别的更多相关文章

  1. (7)MySQL进阶篇SQL优化(InnoDB锁-事务隔离级别 )

    1.概述 在我们在学习InnoDB锁知识点之前,我觉得有必要让大家了解它的背景知识,因为这样才能让我们更系统地学习好它.InnoDB与MyISAM的最大不同有两点:一是支持事务(TRANSACTION ...

  2. SpringBoot 系列教程之事务隔离级别知识点小结

    SpringBoot 系列教程之事务隔离级别知识点小结 上一篇博文介绍了声明式事务@Transactional的简单使用姿势,最文章的最后给出了这个注解的多个属性,本文将着重放在事务隔离级别的知识点上 ...

  3. mysql四种事务隔离级别

    mysql事务并发问题 ACID什么的就不啰嗦了.mysql多个事务并发的时候,可能会出现如下问题: 1. 更新丢失 即两个事务同时更新某一条数据,后执行的更新操作会覆盖先执行的更新操作,导致先执行的 ...

  4. 啥是 MySQL 事务隔离级别?

    之前发过一篇文章,简单了解 MySQL 中相关的锁,里面提到了,如果我们使用的 MySQL 存储引擎为 InnoDB ,并且其事务隔离级别是 RR 可重复读的话,是可以避免幻读的. 但是没想到,都 1 ...

  5. Innodb中的事务隔离级别和锁的关系

    前言: 我们都知道事务的几种性质,数据库为了维护这些性质,尤其是一致性和隔离性,一般使用加锁这种方式.同时数据库又是个高并发的应用,同一时间会有大量的并发访问,如果加锁过度,会极大的降低并发处理能力. ...

  6. Innodb中的事务隔离级别和锁的关系(转)

    原文:http://tech.meituan.com/innodb-lock.html 前言: 我们都知道事务的几种性质,数据库为了维护这些性质,尤其是一致性和隔离性,一般使用加锁这种方式.同时数据库 ...

  7. MySQL InnoDB中的事务隔离级别和锁的关系

    前言: 我们都知道事务的几种性质,数据库为了维护这些性质,尤其是一致性和隔离性,一般使用加锁这种方式.同时数据库又是个高并发的应用,同一时间会有大量的并发访问,如果加锁过度,会极大的降低并发处理能力. ...

  8. 重新学习MySQL数据库9:Innodb中的事务隔离级别和锁的关系

    重新学习MySQL数据库9:Innodb中的事务隔离级别和锁的关系 Innodb中的事务隔离级别和锁的关系 前言: 我们都知道事务的几种性质,数据库为了维护这些性质,尤其是一致性和隔离性,一般使用加锁 ...

  9. InnoDB 事务隔离级别

    InnoDB是一种平衡高可靠性和高性能的通用存储引擎.在MySQL数据库5.5.8版本开始,InnoDB是默认的MySQL存储引擎. InnoDB的主要优势 - 其DML操作遵循ACID,具有提交,回 ...

随机推荐

  1. 必须熟悉的vim快捷键操作

    转载请表明出处http://www.dabu.info/?p=801 Vim/Vi 没有菜单,只有命令 Vim/Vi 工作模式介绍:插入模式 和  命令模式 是vi的两个基本模式.——插入模式 ,是用 ...

  2. 使用Tomcat搭建图片服务器,使图片能够用链接访问

    在后台和前端交互时,遇到了后台存储的图片,前端根据地址无法访问,使用Tomcat搭建图片服务器 1.找到tomcat下的server.xml文件 2.配置文件下加入service节点 <!--为 ...

  3. Java的内存泄漏

    内存泄漏是指,无用对象(不再使用的对象)持续占用内存或者无用对象的内存得不到及时释放,从而造成的内存浪费 就说是有一块内存你不需要再用了,但是呢你还保留着它的指针,那么这块内存就不会被回收 举个例子 ...

  4. adapter中报错:Can't create handler inside thread that has not called Looper.prepare()

    http://stackoverflow.com/questions/9357513/cant-create-handler-inside-thread-that-has-not-called-loo ...

  5. Elasticsearch基础教程

    Reference: http://blog.csdn.net/cnweike/article/details/33736429 基础概念 Elasticsearch有几个核心概念.从一开始理解这些概 ...

  6. Angular - - $compile编译服务与指令

    $compile 这是个编译服务.编译一段HTML字符串或者DOM的模板, 产生一个将scope和模板连接到一起的函数. 编译服务主要是为指令编译DOM元素,下面的一大段也是主要介绍指令的. 下面是一 ...

  7. iPhone应用中加入评分功能

    NSString *str = [NSString stringWithFormat: @"itms-apps://ax.itunes.apple.com/WebObjects/MZStor ...

  8. oracle语句总结(一)

    1,建外键 新建两个表来实现外键的关联. create table main_tab ( id number, name varchar2(30) ); create table sub_tab ( ...

  9. JSP EL表达式 获得 request的GET/POST方法

    JSP EL表达式 获得 request的GET/POST方法: 不在requestScopse中: <p>得到request的方法</p> <p>pageCont ...

  10. javascript与java编码互转

    java:java.net.URLEncoder.encode(s, "UTF-8");java.net.URLDecoder.decode(chezhanInEn,"U ...