隔离是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. VS2010环境下用ANSI C创建DLL和使用方法(转)

    源:VS2010环境下用ANSI C创建DLL和使用方法 . 创建DLL工程 1.2 创建一个dll工程. 操作:a.文件->新建->项目->Win32控制台应用程序. b.输入工程 ...

  2. UVa 10299 - Relatives

    题目大意:Euler's Totient的应用. 几乎和UVa 10179 - Irreducable Basic Fractions一样,于是偷了个懒,直接用10179题的代码,结果WA了,感觉一样 ...

  3. java中常用的空判断

    Java 判断字符串是否为空的四种方法: 方法一: 最多人使用的一个方法, 直观, 方便, 但效率很低: if(s == null ||"".equals(s));方法二: 比较字 ...

  4. OC纯代码全手工打造ScroolView实现翻页

    OC纯代码全手工打造ScroolView实现翻页 1. 概述 分为三部分: 上部标题ScrollView 下部内容ScrollView 上部当前页 标示线 2. 效果 上下两部分都随着手势的滑动一块滑 ...

  5. HNU 13081 Even Up Solitaire解题报告

    题目大意:给定一个数组,若相邻的两个数之和为偶数,则将此两个数移除,通过这种方法将满足条件得数移除后数组还剩多少个数. 此题太水,不做解释.直接代码之: #include <stdio.h> ...

  6. 9 Python+Selenium鼠标事件

    [环境信息] python3.6+Selenium3.0.2+Firefox50.0+win7 [ActionChains类鼠标事件的常用方法] 1.右击:context_click() 2.双击:d ...

  7. CSS图形形状大全

    The Shapes of CSS All of the below use only a single HTML element. Any kind of CSS goes, as long as ...

  8. Div里面载入另一个页面的实现(取代框架)(AJax)

    随着框架越来越不火了,HTML5就不对框架支持了,iframe也只有url了,Div就担当了此大任 DIV+CSS在页面部局确实也很让人满意,使用也更方便 今天突然遇到一个问题,那就是需要导入另一个页 ...

  9. ResultSet遍历过程中修改自身数据,不会改变循环的过程

    ResultSet遍历过程中修改自身数据,不会改变循环的过程: import java.sql.Connection; import java.sql.PreparedStatement; impor ...

  10. 使用XML布局文件和Java代码混合控制UI界面

    完全使用Java代码来控制UI界面不仅烦琐.而且不利于解耦:而完全利用XML布局文件来控制UI界面虽然方便.便捷,但难免有失灵活.因此有些时候,可能需要混合使用XML布局文件和代码来控制UI界面. 当 ...