mysql 事物隔离级别解读
SQL标准定义了4类隔离级别,包括了一些具体规则,用来限定事务内外的哪些改变是可见的,哪些是不可见的。低级别的隔离级一般支持更高的并发处理,并拥有更低的系统开销。
Read Uncommitted(读取未提交内容)
在该隔离级别,所有事务都可以看到其他未提交事务的执行结果。本隔离级别很少用于实际应用,因为它的性能也不比其他级别好多少。读取未提交的数据,也被称之为脏读(Dirty Read)。
Read Committed(读取提交内容)
这是大多数数据库系统的默认隔离级别(但不是MySQL默认的)。它满足了隔离的简单定义:一个事务只能看见已经提交事务所做的改变。这种隔离级别 也支持所谓的不可重复读(Nonrepeatable Read),因为同一事务的其他实例在该实例处理其间可能会有新的commit,所以同一select可能返回不同结果。
Repeatable Read(可重读)
这是MySQL的默认事务隔离级别,它确保同一事务的多个实例在并发读取数据时,会看到同样的数据行。不过理论上,这会导致另一个棘手的问题:幻读 (Phantom Read)。简单的说,幻读指当用户读取某一范围的数据行时,另一个事务又在该范围内插入了新行,当用户再读取该范围的数据行时,会发现有新的“幻影” 行。InnoDB和Falcon存储引擎通过多版本并发控制(MVCC,Multiversion Concurrency Control)机制解决了该问题。
Serializable(可串行化)
这是最高的隔离级别,它通过强制事务排序,使之不可能相互冲突,从而解决幻读问题。简言之,它是在每个读的数据行上加上共享锁。在这个级别,可能导致大量的超时现象和锁竞争。
这四种隔离级别采取不同的锁类型来实现,若读取的是同一个数据的话,就容易发生问题。例如:
脏读(Drity Read):某个事务已更新一份数据,另一个事务在此时读取了同一份数据,由于某些原因,前一个RollBack了操作,则后一个事务所读取的数据就会是不正确的。
不可重复读(Non-repeatable read):在一个事务的两次查询之中数据不一致,这可能是两次查询过程中间插入了一个事务更新的原有的数据。
幻读(Phantom Read):在一个事务的两次查询中数据笔数不一致,例如有一个事务查询了几列(Row)数据,而另一个事务却在此时插入了新的几列数据,先前的事务在接下来的查询中,就会发现有几列数据是它先前所没有的。
在MySQL中,实现了这四种隔离级别,分别有可能产生问题如下所示:
下面,将利用MySQL的客户端程序,分别测试几种隔离级别。测试数据库为test,表为tx;表结构:
id | int |
num |
int |
两个命令行客户端分别为A,B;不断改变A的隔离级别,在B端修改数据。
(一)、将A的隔离级别设置为read uncommitted(未提交读)
在B未更新数据之前:
客户端A:
B更新数据:
客户端B:
客户端A:
经过上面的实验可以得出结论,事务B更新了一条记录,但是没有提交,此时事务A可以查询出未提交记录。造成脏读现象。未提交读是最低的隔离级别。
(二)、将客户端A的事务隔离级别设置为read committed(已提交读)
在B未更新数据之前:
客户端A:
B更新数据:
客户端B:
客户端A:
经过上面的实验可以得出结论,已提交读隔离级别解决了脏读的问题,但是出现了不可重复读的问题,即事务A在两次查询的数据不一致,因为在两次查询之间事务B更新了一条数据。已提交读只允许读取已提交的记录,但不要求可重复读。
(三)、将A的隔离级别设置为repeatable read(可重复读)
在B未更新数据之前:
B更新数据:
客户端B:
客户端A:
B插入数据:
客户端B:
客户端A:
由以上的实验可以得出结论,可重复读隔离级别只允许读取已提交记录,而且在一个事务两次读取一个记录期间,其他事务部的更新该记录。但该事务不要求与其他事务可串行化。例如,当一个事务可以找到由一个已提交事务更新的记录,但是可能产生幻读问题(注意是可能,因为数据库对隔离级别的实现有所差别)。像以上的实验,就没有出现数据幻读的问题。
(四)、将A的隔离级别设置为 可串行化 (Serializable)
A端打开事务,B端插入一条记录
事务A端:
事务B端:
因为此时事务A的隔离级别设置为serializable,开始事务后,并没有提交,所以事务B只能等待。
事务A提交事务:
事务A端
事务B端
serializable完全锁定字段,若一个事务来查询同一份数据就必须等待,直到前一个事务完成并解除锁定为止 。是完整的隔离级别,会锁定对应的数据表格,因而会有效率的问题。
mysql 事物隔离级别解读相关推荐
- Mysql事物隔离级别
事物隔离级别 脏读 不可重复读 幻读 读未提交(read-uncommitted) 是 是 是 不可重复读(read-ccommitted) 否 是 是 可重复读 (repeatable-read) ...
- mysql 事物隔离级别详解
SQL标准定义了4类隔离级别,包括了一些具体规则,用来限定事务内外的哪些改变是可见的,哪些是不可见的.低级别的隔离级一般支持更高的并发处理,并拥有更低的系统开销. Read Uncommitted ...
- MySQL 事物隔离级别
1.什么是事物: 访问并可能更新数据库的一个完整的程序执行单元(UNIT) 2.事物必须满足ACID特性: A,atomic,原子性,要么都提交,要么都失败,不能一部分成功,一部分失败. C,cons ...
- oracle mysql事物隔离级别_Oracle数据库事物隔离级别
事务隔离级别:一个事务对数据库的修改与并行的另一个事务的隔离程度. 两个并发事务同时访问数据库表相同的行时,可能存在以下三个问题: 1.幻想读:事务T1读取一条指定where条件的语句,返回结果集.此 ...
- SHOW VARIABLES LIKE “tx_isolation“查看mysql查看当前数据库的事物隔离级别
SHOW VARIABLES LIKE "tx_isolation"查看mysql查看当前数据库的事物隔离级别
- MySQL数据库事物隔离级别
mysql数据库的事物隔离级别主要有四种: Serializable 串行化,一个事物一个事物的执行 Repeatable read 可重复读 , 无论其他事物是否修改并提交了数据,在这个事物中看到的 ...
- 数据库的四种事物隔离级别(基于MySQL的InnoDB存储引擎)
准备工作 创建一个表,并插入几条基础数据 CREATE TABLE `transaction_isolation` (`id` bigint(10) NOT NULL AUTO_INCREMENT,` ...
- mysql 消极锁_MySQL支持的事物隔离级别以及消极锁和乐观锁原理和应用场景
在一样平常开发中,尤其是营业开发,少不了行使 Java 对数据库举行基本的增删改查等数据操作,这也是Java工程师的必备手艺之一.做好数据操作,不仅仅需要对Java语言相关框架的掌握,更需要对种种数据 ...
- mysql事务隔离级别与设置
mysql数据库,当且仅当引擎是InnoDB,才支持事务: 1.隔离级别 事务的隔离级别分为:未提交读(read uncommitted).已提交读(read committed).可重复读(repe ...
最新文章
- OpenMP入门教程(一)hello world
- Springboot测试类的编写
- 怎么将excel数据导入到datagridview中
- array sort - 4 : merge sort
- 公众号jdk 获取手机号_如何获取公众号推文封面图
- android 联系数据库
- 生物研究中不得缺少的数字概念
- 朱石景 201671010457 团队项目评审课程学习总结
- 重新分区_全面解析win10系统硬盘分区怎么调整大小
- 面试题:怎么以最快速度计算8*4:
- 如何启用台式计算机无线开关,联想一体机无线网卡开关如何开启_怎么打开联想电脑一体机WiFi无线开关-win7之家...
- 用Verilog编写“数显LED的亮度控制电路”
- 佳能数码相机,不能安装驱动程序
- 斐波那契数列_菲波那契数列是指这样的数列: 数列的第一个和第二个数都为1,接下来每个数都等于前面2个数之和。给出一个正整数a,要求菲波那契数列中第a个数对1000取模的结果是多少。
- vue项目打包部署注意点 + 宝塔面板几步部署项目
- 权限管理系统(用户信息管理模块业务组件实现代码,带注解)
- 写给在校的GISER
- 盘点 深度学习妖怪 之 激活函数妖
- 自控力极差的人如何自救?
- 大一学生HTML个人网页作业作品——火影忍者动漫7页面带特效带轮播(HTML+CSS+JavaScript)
热门文章
- matlab压控振荡器,MATLAB仿真应用_第5章(1)解析.ppt
- mysql支持事务的存储引擎_MySQL基础(三)【MySQL事务与存储引擎】
- ImportError: cannot import name 'pyopenpose' from 'openpose'错误解决方法
- js关闭setInterval及终止ajax请求
- 【测试方法篇】效率测试
- 【测试工具】在linux测试环境安装bug管理工具禅道
- 【MySQL】JavaWeb项目中配置数据库的连接池
- [转]动态规划DP的分类
- Nginx 快速搭建HTTP 文件服务器
- B1023 组个最小数 (20分)