MySql(Innodb)事务隔离级别
事务将数据库从一个一致状态转换至另外一个一致状态,若某个事务看到了另外一个事务在状态转换过程中的中间态数据(不一致状态),将有可能导致另外一个事务的操作基于一个不一致的数据库状态,进而数据库失去一致性。事务隔离性主要用于处理数据库的并发访问问题。
ACID
回顾事务的ACID特性,ACID分别是一下四个词的缩写:
- Atomicity(原子性)
- Consistency(一致性)
- Isolation(隔离性)
- Durability(持久性)
事务隔离性
“隔离性还有其他的称呼,如并发控制(concurrency control)、可串行化(serializability)、锁(locking)等。事务的隔离性要求每个读写事务的对象对其他事务的操作对象能相互分离,即该事务提交前对其他事务都不可见,通常这使用锁来实现。当前数据库系统中都提供了一种粒度锁(granular lock)的策略,允许事务仅锁住一个实体对象的子集,以此来提高事务之间的并发度。”
简单的说,事务隔离性就是指在并发情况下,事务能够相互隔离,不彼此影响,避免一些“不良反应”。
事务并发
在并发状态时,如果不控制好事务,如果事务没有隔离性,会有哪些“不良反应”?
脏读(Dirty read):
- 事务 A 在操作数据时,把数据 a 改成 b,但是事务未提交;
- 此时数据 a 是之前的数据,是有效的。数据 b 未提交,是无效的,如果在事务处理期间发生错误,数据 b 会回滚到 a;
- 如果此时事务 B 访问了数据,得到的是 b,那么就发生了脏读,读到了“脏数据” b。
不可重复读(Unrepeatableread):
- 因为业务需要,事务 A 在处理事务过程中,需要多次读取数据 a=1,而且每次读取的结果需要一样,即 a 时刻保持1;
- 事务 B 在事务 A 的处理过程中,修改了 a 的值,a=2;
事务 A 对于数据 a,不能保证重复读取时的值保持一致,这就是不可重复读。
幻读(Phantom):
- 事务 A 读取满足条件的某些数据,返回了 5 条数据;
- 事务 B 插入了新的满足同样条件的数据;
- 事务 A 因为业务需要再次读取数据,此次返回了 6 条数据,多出的数据就好像是“幻影”(Phantom)一样;
可以看到,“幻读”和“不可重复读”有点类似,两者都是在事务 A 过程中需要读取多次数据,但是期间数据被另一个事务 B 篡改,导致多次读到的数据不一致。
不同点在于,“不可重复读”是数据“值”的不一致,而“幻读”是数据记录的“数量”的不一致。丢失修改(Lost to modify):
- 事务 A 和 事务 B 都要修改数据 num=2;
- 事务 A 和 事务 B 同时读到 num=2;
- 事务 A 把数据 num 减一变成 num=1;
- 事务 B 也把数据 num 减一,但确是在读到的初始值上减一(num=2-1=1),而不是在事务 A 的基础上减一(num=1-1=0)。
这样,事务 A 的操作结果被事务 B 的操作结果覆盖了,相当于事务 A 对数据的修改“丢失”了。
事务隔离级别
事务的隔离级别,就是能够避免在事务并发条件下产生的“不良反应”的能力,就是事务能隔绝其它事务的影响的能力。
事务的隔离级别越高,规避风险的能力也越强,事务在并发环境下出现的“不良反应”的概率越低。
“隔离级别越低,事务请求的锁越少或保持锁的时间就越短。”——《xx内幕InnoDB引擎》
“事务的隔离级别”,表示的是一种规范、约束,不同的数据库的具体实现都不一致,不同数据库采取不同的措施来保证事务达到对应的隔离级别。
MySql中包含四级的事务隔离级别,如下:
读未提交
READ-UNCOMMITTED,简写“RU”。应该扩展为“read uncommitted record”,即“可读未提交的记录”。表示在一个事务未提交时,另一个事物被允许读取相关的数据。
这是最低的隔离级别,相当于啥也没干,自然地,上述的“不良反应”在这种情况下都会发生。
读已提交
READ-COMMITTED,“read committed record”,“只能读已提交的记录”,简写“RC”。在一个事务提交后,另一个才被允许读取相关数据。
在这种级别下,当一个事务修改了数据,产生了“脏数据”,而该事务又尚未提交时,另一个事务不被允许去读取相关的数据,自然地这就解决了“脏读的问题”。
读已提交只允许读已提交的数据,避免了脏读现象。但是存在以下情况:在事务T1内,读取了数据D值为D1,然后T1执行其他SQL,事务T2更新了D为D2并提交,此时T1再次读取D时值为D2。这种情况称为不可重复读。
可重复读
REPEATABLE-READ,简写“RR”。这种隔离级别下,需要保证一个事务内多次读取某个记录,其数据都是一致的。该级别杜绝了“脏读”和“不可重复读”的问题。
可重复读只允许读已提交数据,而且在一个事务两次读取一个数据项期间,其他事务不得更新该数据,避免了不可重复读现象。虽然其他事务不得更新该数据,但是并未禁止不得插入新数据,这使得在一个事务内,两次同样的SELECT语句读取的记录数量是不一致的,这种情况称为幻读。
序列化
SERIALIZABLE,在这种隔离级别下,事务串行执行,能够解决“脏读”、“不可重复读”、“幻读”、“丢失修改”的问题,当然,因为是串行执行,所以它的性能是最低的。
MySQL中这四种隔离级别的字符、数字编号表示如下:
四种隔离级别说明
隔离级别 | 丢失更新 | 脏读(Dirty Read) | 不可重复读(NonRepeatable Read) | 幻读(Phantom Read) |
---|---|---|---|---|
未提交读(Read uncommitted) | 不可能 | 可能 | 可能 | 可能 |
已提交读(Read committed) | 不可能 | 不可能 | 可能 | 可能 |
可重复读(Repeatable read) | 不可能 | 不可能 | 不可能 | 可能 |
可串行化(SERIALIZABLE) | 不可能 | 不可能 | 不可能 | 不可能 |
脏读 :一个事务读取到另一事务未提交的更新数据
不可重复读 : 在同一事务中,多次读取同一数据返回的结果有所不同, 换句话说, 后续读取可以读到另一事务已提交的更新数据. 相反, “可重复读”在同一事务中多次读取数据时, 能够保证所读数据一样, 也就是后续读取不能读到另一事务已提交的更新数据。
幻读 :一个事务读到另一个事务已提交的insert数据
MySql(Innodb)事务隔离级别的更多相关文章
- 重新学习MySQL数据库8:MySQL的事务隔离级别实战
重新学习Mysql数据库8:MySQL的事务隔离级别实战 在Mysql中,事务主要有四种隔离级别,今天我们主要是通过示例来比较下,四种隔离级别实际在应用中,会出现什么样的对应现象. Read unco ...
- mysql事务之一:MySQL数据库事务隔离级别(Transaction Isolation Level)及锁的实现原理
一.数据库隔离级别 数据库隔离级别有四种,应用<高性能mysql>一书中的说明: 然后说说修改事务隔离级别的方法: 1.全局修改,修改mysql.ini配置文件,在最后加上 1 #可选参数 ...
- MySQL实战 | 03 - 谁动了我的数据:浅析MySQL的事务隔离级别
原文链接:这一次,带你搞清楚MySQL的事务隔离级别! 使用过关系型数据库的,应该都事务的概念有所了解,知道事务有 ACID 四个基本属性:原子性(Atomicity).一致性(Consistency ...
- 【MySQL】事务隔离级别及ACID
注:begin或start transaction并不是一个事务的起点,而是在执行它们之后的第一个操作InnoDB表的语句,事务才真正开始.start transaction with consist ...
- 一文读懂MySQL的事务隔离级别及MVCC机制
回顾前文: 一文学会MySQL的explain工具 一文读懂MySQL的索引结构及查询优化 (同时再次强调,这几篇关于MySQL的探究都是基于5.7版本,相关总结与结论不一定适用于其他版本) 就软件开 ...
- 【Java面试】请你简单说一下Mysql的事务隔离级别
一个工作了6年的粉丝,去阿里面试,在第一面的时候被问到"Mysql的事务隔离级别". 他竟然没有回答上来,一直在私信向我诉苦. 我说,你只能怪年轻时候的你,那个时候不够努力导致现在 ...
- MySQL之事务隔离级别--转载
转自:http://793404905.blog.51cto.com/6179428/1615550 本文通过实例展示MySQL事务的四种隔离级别. 1 概念阐述 1)Read Uncommitted ...
- mysql数据库——事务隔离级别
四种隔离级别: 一:READ UNCOMMITTED(未提交读) 事务可以读取其他事务未提交的数据,称为脏读 二:READ COMMITTED(提交读) 一个事务开始时,只能"看见" ...
- InnoDB事务隔离级别
转载于:http://blog.csdn.net/wudongxu/article/details/8623610 SQL标准定义了4类隔离级别,包括了一些具体规则,用来限定事务内外的哪些改变是可见的 ...
- MySQL数据库事务隔离级别(Transaction Isolation Level)
转自: http://www.cnblogs.com/zemliu/archive/2012/06/17/2552301.html 数据库隔离级别有四种,应用<高性能mysql>一书中的 ...
随机推荐
- java启动参考
启动参数 mvn clean package -Dmaven.test.skip=true -Ptest - java - -server - -Xms2G - -Xmx2G - -Xss256K - ...
- centos 7网卡配置文件详解(ifcfg-ens33)
centos 7网卡配置文件详解(ifcfg-ens33) [root@xuegod63 ~]# cat /etc/sysconfig/network-scripts/ifcfg-ens33 TYPE ...
- 本地项目文件上传到git
初始化项目: git init 与服务器项目关联:git remote add origin "http://**************************/r/ruoyi.git&q ...
- Java应用的优雅停机
一. 优雅停机的概念 优雅停机一直是一个非常严谨的话题,但由于其仅仅存在于重启.下线这样的部署阶段,导致很多人忽视了它的重要性,但没有它,你永远不能得到一个完整的应用生命周期,永远会对系统的健壮性持怀 ...
- Maven到底是什么
Maven 是一个项目管理工具,它最主要的两个功能就是:依赖管理和项目构建. 何为依赖管理 在传统项目中,我们的项目如果需要第三方提供的库就必须得去官网上下载,有了Maven我们只需要在pom文件 ...
- 莫烦tensorflow学习记录 (6)卷积神经网络 CNN (Convolutional Neural Network)
卷积 和 神经网络 莫烦大佬的原文章https://mofanpy.com/tutorials/machine-learning/tensorflow/intro-CNN/ 我的理解就是千层饼,鸡蛋烧 ...
- ReplayKit2 采集音视频回调格式分析
一.iOS中的音视频都是采用一个叫做CMSampleBuffer的格式封装的 比如回调的App音频 Printing description of sampleBuffer: CMSampleBuff ...
- bashrc和profile区别
转载请注明出处: 作用与目的: .bashrc:这个文件主要用于配置和自定义用户的终端环境和行为.每次启动新的终端时,.bashrc文件都会被执行,加载用户设置的环境变量.别名.函数等.这使得用户能够 ...
- 算法学习笔记(39): 2-SAT
SAT 问题,也就是可满足性问题 Boolean Satisfiability Problem,是第一个被证明的 NPC 问题. 但是特殊的 2-SAT 我们可以通过图论的知识在线性复杂度内求解,构造 ...
- OOP第二阶段题集总结
一.前言 知识点:考察继承和多态为多,其中还涉及迭代器的使用,在每个题集中都有一个综合性题目设计多方面知识点考试,有List类和HashMap的使用以及正则表达式的运用,并且注重考查设计,理解类与类之 ...