理解InnoDB的事务隔离级别
隔离是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的事务隔离级别的更多相关文章
- (7)MySQL进阶篇SQL优化(InnoDB锁-事务隔离级别 )
1.概述 在我们在学习InnoDB锁知识点之前,我觉得有必要让大家了解它的背景知识,因为这样才能让我们更系统地学习好它.InnoDB与MyISAM的最大不同有两点:一是支持事务(TRANSACTION ...
- SpringBoot 系列教程之事务隔离级别知识点小结
SpringBoot 系列教程之事务隔离级别知识点小结 上一篇博文介绍了声明式事务@Transactional的简单使用姿势,最文章的最后给出了这个注解的多个属性,本文将着重放在事务隔离级别的知识点上 ...
- mysql四种事务隔离级别
mysql事务并发问题 ACID什么的就不啰嗦了.mysql多个事务并发的时候,可能会出现如下问题: 1. 更新丢失 即两个事务同时更新某一条数据,后执行的更新操作会覆盖先执行的更新操作,导致先执行的 ...
- 啥是 MySQL 事务隔离级别?
之前发过一篇文章,简单了解 MySQL 中相关的锁,里面提到了,如果我们使用的 MySQL 存储引擎为 InnoDB ,并且其事务隔离级别是 RR 可重复读的话,是可以避免幻读的. 但是没想到,都 1 ...
- Innodb中的事务隔离级别和锁的关系
前言: 我们都知道事务的几种性质,数据库为了维护这些性质,尤其是一致性和隔离性,一般使用加锁这种方式.同时数据库又是个高并发的应用,同一时间会有大量的并发访问,如果加锁过度,会极大的降低并发处理能力. ...
- Innodb中的事务隔离级别和锁的关系(转)
原文:http://tech.meituan.com/innodb-lock.html 前言: 我们都知道事务的几种性质,数据库为了维护这些性质,尤其是一致性和隔离性,一般使用加锁这种方式.同时数据库 ...
- MySQL InnoDB中的事务隔离级别和锁的关系
前言: 我们都知道事务的几种性质,数据库为了维护这些性质,尤其是一致性和隔离性,一般使用加锁这种方式.同时数据库又是个高并发的应用,同一时间会有大量的并发访问,如果加锁过度,会极大的降低并发处理能力. ...
- 重新学习MySQL数据库9:Innodb中的事务隔离级别和锁的关系
重新学习MySQL数据库9:Innodb中的事务隔离级别和锁的关系 Innodb中的事务隔离级别和锁的关系 前言: 我们都知道事务的几种性质,数据库为了维护这些性质,尤其是一致性和隔离性,一般使用加锁 ...
- InnoDB 事务隔离级别
InnoDB是一种平衡高可靠性和高性能的通用存储引擎.在MySQL数据库5.5.8版本开始,InnoDB是默认的MySQL存储引擎. InnoDB的主要优势 - 其DML操作遵循ACID,具有提交,回 ...
随机推荐
- bzoj 4002: [JLOI2015]有意义的字符串
这个题... #include <bits/stdc++.h> #define rep(i, a, b) for (int i = a; i <= b; i++) #define d ...
- 解决VirtualBox下安装虚拟机(Ubuntu)出错(不能为虚拟电脑Ubuntu打开一个新的任务)的有关问题
[转]http://www.myexception.cn/program/1964906.html 解决VirtualBox下安装虚拟机(Ubuntu)出错(不能为虚拟电脑Ubuntu打开一个新的任务 ...
- Android实现渐显按钮的左右滑动效果
本示例演示在Android中实现带渐显按钮的左右滑动效果. 关于滑动效果,在我的上一篇博文中提到过,有兴趣的朋友可以访问: http://www.cnblogs.com/hanyonglu/archi ...
- C语言-知识点及学习路线
最近进行了为期两周的C语言培训,把几年前学过的C语言又重新学习了一遍,然后根据学习的内容和过程,总结了一下学习路线.这是基本的C语言学习路线,相当于编程语言类的基础,再根据自己究竟是要做单片机开发,还 ...
- 分布式存储 CentOS6.5虚拟机环境搭建FastDFS-5.0.5集群(转载)
原文:http://www.open-open.com/lib/view/open1435468300700.html 第一步,确定目标: Tracker 192.168.224.20:22122 ...
- Linux之目录基本操作命令
Linux之目录基本操作命令 目录基本操作命令 1.tree命令 tree命令以树状图列出目录的内容. 语法 tree(选项)(参数) 选项 1.-a显示所有文件和目录 2.-A使用ASNI绘图字符显 ...
- 详细解析Linux scp命令的应用
详细解析Linux scp命令的应用 Linux命令有人统计说是有4000多个,Linux scp命令是用于Linux之间复制文件和目录,这里详细介绍scp命令使用和参数. AD: Linux scp ...
- Java自然语言处理NLP工具包
1. Java自然语言处理 LingPipe LingPipe是一个自然语言处理的Java开源工具包.LingPipe目前已有很丰富的功能,包括主题分类(Top Classification).命名实 ...
- 【js 编程艺术】小制作四
1. html <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <t ...
- C# 得到本机局域网IP地址
C#获取本机IP搜集整理7种方法:http://blog.csdn.net/frombegintoend/article/details/7713097 使用IPHostEntry获取本机局域网地址 ...