数据库事务隔离级别-- 脏读、幻读、不可重复读
一、数据库事务的隔离级别
数据库事务的隔离级别有4个,由低到高依次为Read uncommitted 、Read committed 、Repeatable read 、Serializable,这四个级别可以逐个解决脏读 、不可重复读 、幻读这几类问题。
1、READ-UNCOMMITTED(读取未提交)
最低的隔离级别,允许读取尚未提交的数据变更,可能会导致脏读、幻读或不可重复读。
2、READ-COMMITTED(读取已提交)
允许读取并发事务已经提交的数据,可以阻止脏读,但是幻读或不可重复读仍有可能发生。
3、REPEATABLE-READ(可重复读)
对同一字段的多次读取结果都是一致的,除非数据是被本身事务自己所修改,可以阻止脏读和不可重复读,但幻读仍有可能发生。
4、SERIALIZABLE(可串行化)
最高的隔离级别,完全服从ACID的隔离级别。所有的事务依次逐个执行,这样事务之间就完全不可能产生干扰,也就是说,该级别可以防止脏读、不可重复读以及幻读。
MySQL InnoDB 存储引擎的默认支持的隔离级别是 REPEATABLE-READ(可重读)。我们可以通过SELECT @@tx_isolation;命令来查看
mysql> SELECT @@tx_isolation;
因为隔离级别越低,事务请求的锁越少
二、不同事务级别带来的并发问题
1.脏读
脏读发生在一个事务A读取了被另一个事务B修改,但是还未提交的数据。假如B回退,则事务A读取的是无效的数据。这跟不可重复读类似,但是第二个事务不需要执行提交。
2.不可重复读
在基于锁的并行控制方法中,如果在执行select时不添加读锁,就会发生不可重复读问题。
在多版本并行控制机制中,当一个遇到提交冲突的事务需要回退但却被释放时,会发生不可重复读问题。
在上面这个例子中,事务2提交成功,它所做的修改已经可见。然而,事务1已经读取了一个其它的值。在序列化和可重复读的隔离级别中,数据库管理系统会返回旧值,即在被事务2修改之前的值。在提交读和未提交读隔离级别下,可能会返回被更新的值,这就是“不可重复读”。
有两个策略可以防止这个问题的发生:
(1) 推迟事务2的执行,直至事务1提交或者回退。这种策略在使用锁时应用。
(2) 而在多版本并行控制中,事务2可以被先提交。而事务1,继续执行在旧版本的数据上。当事务1终于尝试提交时,数据库会检验它的结果是否和事务1、事务2顺序执行时一样。如果是,则事务1提交成功。如果不是,事务1会被回退。
3.幻读
幻读发生在当两个完全相同的查询执行时,第二次查询所返回的结果集跟第一个查询不相同。
发生的情况:没有范围锁。
三、例子比较不可重复读和幻读
1、脏读(Dirty read)
A事务读取了B事务尚未提交的更改数据,并在这个读取的脏数据上进行操作。如果这时B事务恰巧进行了回滚事务,那么A事务读取的事务是不被承认的
如下取款事务和转账事务
2、不可重复读(Unrepeatableread)
不可重复读是指A事务读取了B事务已经提交的更改数据
3、幻读(Phantom read)
A事务读取到B事务提交的新增数据,幻象读一般发生在数据统计事务中
不可重复度和幻读区别:
不可重复读和幻读容易混淆
不可重复读一般针对的是行级别的数据的更改(修改),不可重复读的重点是修改
幻象读一般针对表级别的新增数据,在统计事务中,两次读取的数据统计不一致,幻读的重点在于新增或者删除
数据库事务隔离级别-- 脏读、幻读、不可重复读相关推荐
- MySQL --- 19♪ 进阶15 TCL事务控制语言--建立结束事务/设置断点--默认隔离级别--脏读/幻读/不可重复读
#TCL事物控制语言 : /* Transaction control language : 事物控制语言 事务: 一个或者一组sql语句组成一个执行单元,这个执行单元要么全部执行,要 ...
- 事务隔离级别脏读幻读_脏读和未提交读隔离级别
事务隔离级别脏读幻读 In this article, we will discuss the Dirty Read concurrency issue and also learn the deta ...
- MySQL数据库中,在读已提交和可重复读这两个不同事务隔离级别下幻读的区别
目 录 1. 前 言 1.1 并发事务存在的问题 1.2 事务的隔离级别 1.3 快照读和当前读 2. 不同事务隔离级别下幻读的区别 2.1 读已提交下的幻读 2.2 可重复读下的幻读 2.2.1 情 ...
- mysql 中的脏读与幻读_一文带你理解脏读,幻读,不可重复读与mysql的锁,事务隔离机制...
首先说一下数据库事务的四大特性 1 ACID 事务的四大特性是ACID(不是"酸"....) (1) A:原子性(Atomicity) 原子性指的是事务要么完全执行,要么完全不执行 ...
- mysql 可重复读 悲观锁_一文带你理解脏读,幻读,不可重复读与mysql的锁,事务隔离机制...
首先说一下数据库事务的四大特性 1 ACID 事务的四大特性是ACID(不是"酸"....) (1) A:原子性(Atomicity) 原子性指的是事务要么完全执行,要么完全不执行 ...
- mysql悲观锁会有脏数据吗_一文带你理解脏读,幻读,不可重复读与mysql的锁,事务隔离机制...
首先说一下数据库事务的四大特性 1 ACID 事务的四大特性是ACID(不是"酸"....) (1) A:原子性(Atomicity) 原子性指的是事务要么完全执行,要么完全不执行 ...
- 数据库事务隔离级别-- 脏读、幻读、不可重复读(清晰解释)
一.数据库事务隔离级别 数据库事务的隔离级别有4个,由低到高依次为Read uncommitted .Read committed .Repeatable read .Serializable ,这四 ...
- 事务的4种隔离级别,3大问题,脏读幻读不可重复读
一.数据库事务隔离级别 数据库事务的隔离级别有4个,由低到高依次为Read uncommitted .Read committed .Repeatable read .Serializable ,这四 ...
- 数据库几个事务相关的知识点(脏读幻读不可重复读以及如何避免)
0. 设置MYSQL的隔离界别 # 查询数据库当前事务隔离级别 mysql> select @@global.transaction_isolation,@@transaction_isolat ...
- 脏读 幻读 不可重复读 及其解决方法
一个事务读到另外一个事务还没有提交的数据,我们称之为脏读.解决方法:把事务隔离级别调整到READ COMMITTED 一个事务先后读取同一条记录,但两次读取的数据不同,我们称之为不可重复读.解决方法: ...
最新文章
- 图神经网络在生物医药领域的12项研究综述
- Selenium java环境搭建
- 小程序笔记一:基础设置
- mysql.max links_Mysql的max_allowed_packet设定
- spring 扫描所有_从Spring的几个阶段理解其工作过程
- 偶尔用得上的MySQL操作
- SAP GUI security setting on local file access
- EPSON 利用CCD图像处理包标定工具坐标系
- vue使用 xterm_为什么我坚持使用xterm
- 电脑java语言有什么用_Java语言是什么?_Java语言有什么优点
- ARM GIC-400 寄存器
- Linux中重定向的实验总结,Linux中重定向命令行的总结
- mysql查询id为偶数_MySQL中查询中位数?
- System.ConfigurationManager类用于对配置文件的读取
- 20170831_安装软件
- [转载] 全本张广泰——第九回 出世见师兄 广泰走江湖
- python 3des加密_Python 3DES 加密解密
- 虚拟机运行python_虚的解释|虚的意思|汉典“虚”字的基本解释
- microbit积木块菜单图标
- Quantopian自学笔记03
热门文章
- fpga如何约束走线_经验总结:FPGA时序约束的6种方法
- 可靠性编码之格雷码(Gray码)
- 压缩pdf文件,自行调节清晰度从而调节文件大小,切分pdf文件为多个小文件,控制每个文件大小
- 【邀您参加】Android大讲堂-Android游戏开发之捕鱼游戏
- android 百度地图描点,划线
- Minio分布式对象存储的部署与使用
- [Leetcode]5970. 参加会议的最多员工数
- HTML+CSS大作业——神偷奶爸(10页) HT简单个人网页设计作业 静态动漫主题网页作业 DW个人网站模板下载 大学生简单个人网页作品代码
- 【雷达成像】合成孔径雷达RD成像算法matlab仿真
- cad重新加载php命令,cad折断线命令是什么