理解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,具有提交,回 ...
随机推荐
- HCSR04超声波传感器驱动
HC_SR04是一款使用较为广泛的超声波测距模块,模块图如下 该模块具有四个引脚,分别为VCC GND TRIG ECHO,其中VCC GND为供电脚 TRIG为测距触发引脚,ECHO为测距输入引脚 ...
- sqlserver修改增删改字段
---新增列 alter table article add addtime0 datetime ---修改列 alter table article ) --删除列 alter table arti ...
- FB面经 Prepare: All Palindromic Substrings
Given a string, calculate how many substring is palindrome. Ignore non-char characters. Ignore case; ...
- 使用SSH搭建用户注册登录系统
[转]http://blog.sina.com.cn/s/blog_a6a6b3cd01017c57.html 什么是SSH? SSH对应 struts spring hibernatestruts ...
- java的HashCode和equals
什么时候用到hashcode,什么时候用到equals? 首先java为每个对象都生成有默认的hashcode,这个java core里说是java对象的内存地址,但是equals方法里比较的也是对象 ...
- 学习tabhost 实现微博的主界面
2014-05-27 吴文付 微博的主界面还是很漂亮的,我们这里来熟悉下tabhost的使用, 网上资料很多,主要参考了:http://blog.csdn.net/shulianghan/articl ...
- MySQL数据库面试
1. MySql的存储引擎的不同 特点 Myisam BDB Memory InnoDB Archive 存储限制 没有 没有 有 64TB 没有 事务安全 支持 支持 锁机制 表锁 页锁 ...
- html 5 本地数据库(Web Sql Database)核心方法openDatabase、transaction、executeSql 详解
Web SQL数据库API实际上不是HTML5规范的组成部分,而是单独的规范.它通过一套API来操纵客户端的数据库.Safari.Chrome. Firefox.Opera等主流浏览器都已经支持Web ...
- window.open a.href打开窗口referer的问题
window.open a.href打开窗口referer的问题: JSP: <%@ page language="java" import="java.util. ...
- jQuery event,冒泡,默认事件用法
jQuery event,冒泡,默认事件用法 <%@ page language="java" import="java.util.*" pageEnco ...