隔离是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. 继续PHP

    2014-04-08 09:44:43 继续PHP. 邵杨继续回来 工作,安卓还是交给他.

  2. bzoj 1036

    1036: [ZJOI2008]树的统计Count Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 11858  Solved: 4803[Submit ...

  3. bzoj3932

    3932: [CQOI2015]任务查询系统 Time Limit: 20 Sec  Memory Limit: 512 MBSubmit: 1326  Solved: 480[Submit][Sta ...

  4. 关键词匹配(Ac自动机模板题)

    2772: 关键词匹配 Time Limit: 1 Sec  Memory Limit: 128 MBSubmit: 10  Solved: 4[Submit][Status][Web Board] ...

  5. 前端制作篇之meta标签篇

    移动端前端制作有些地方不同于互联网,这篇主要讨论的是meta标签.meta标签位于之间.是主要辅助HTML结构层的.meta标签不管在互联网前端还是在移动端都起了很重要的作用.这里只讨论移动端. 附上 ...

  6. iOS 之 const

    const int a与 int const a一样. const int *a ;//指针可以修改,指向常整形的指针 int* const a;// 常指针, int* 作为一个整体被限制, 所以指 ...

  7. 【angularjs】【学习心得】路由基础篇

    原文:http://www.imooc.com/wenda/detail/236998 AngularJS自带有路由模块ngRoute,但是有经验的老师都推荐我们使用功能更完善更强大的ui-route ...

  8. UWP锁、解屏后无法响应操作

    UWP的Unity项目,在PC上运行时,如果锁屏(手动或自动)再解锁,游戏画面和进度正常,但是无法进行鼠标.键盘或手柄的操作.这Bug在很多线上的Unity项目中存在. 原因:UWP App的系统事件 ...

  9. http的Max-Forwards头的作用(转)

    请求头的Max-Forwards用来请求特定代理.当代理收到一个允许URI转发的OPTIONS请求,则检查Max-Forwards.如果Max-Forwards值为0,则不能转发该消息:相反,代理会将 ...

  10. KingbaseES的HA搭建

    1.配置资源前准备: 安装好数据库并保持两台机器用户ID及组ID一致,组ID和用户ID在/etc/passwd查看,如不保持一致,可能导致切机时阵列的属主改变,导致数据库无法启动. 建议用法,现在两台 ...