一、数据库事务的隔离级别
数据库事务的隔离级别有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事务提交的新增数据,幻象读一般发生在数据统计事务中

不可重复度和幻读区别:

不可重复读和幻读容易混淆

不可重复读一般针对的是行级别的数据的更改(修改),不可重复读的重点是修改

幻象读一般针对表级别的新增数据,在统计事务中,两次读取的数据统计不一致,幻读的重点在于新增或者删除

数据库事务隔离级别-- 脏读、幻读、不可重复读相关推荐

  1. MySQL --- 19♪ 进阶15 TCL事务控制语言--建立结束事务/设置断点--默认隔离级别--脏读/幻读/不可重复读

    #TCL事物控制语言 : /*   Transaction control language : 事物控制语言   事务:     一个或者一组sql语句组成一个执行单元,这个执行单元要么全部执行,要 ...

  2. 事务隔离级别脏读幻读_脏读和未提交读隔离级别

    事务隔离级别脏读幻读 In this article, we will discuss the Dirty Read concurrency issue and also learn the deta ...

  3. MySQL数据库中,在读已提交和可重复读这两个不同事务隔离级别下幻读的区别

    目 录 1. 前 言 1.1 并发事务存在的问题 1.2 事务的隔离级别 1.3 快照读和当前读 2. 不同事务隔离级别下幻读的区别 2.1 读已提交下的幻读 2.2 可重复读下的幻读 2.2.1 情 ...

  4. mysql 中的脏读与幻读_一文带你理解脏读,幻读,不可重复读与mysql的锁,事务隔离机制...

    首先说一下数据库事务的四大特性 1 ACID 事务的四大特性是ACID(不是"酸"....) (1) A:原子性(Atomicity) 原子性指的是事务要么完全执行,要么完全不执行 ...

  5. mysql 可重复读 悲观锁_一文带你理解脏读,幻读,不可重复读与mysql的锁,事务隔离机制...

    首先说一下数据库事务的四大特性 1 ACID 事务的四大特性是ACID(不是"酸"....) (1) A:原子性(Atomicity) 原子性指的是事务要么完全执行,要么完全不执行 ...

  6. mysql悲观锁会有脏数据吗_一文带你理解脏读,幻读,不可重复读与mysql的锁,事务隔离机制...

    首先说一下数据库事务的四大特性 1 ACID 事务的四大特性是ACID(不是"酸"....) (1) A:原子性(Atomicity) 原子性指的是事务要么完全执行,要么完全不执行 ...

  7. 数据库事务隔离级别-- 脏读、幻读、不可重复读(清晰解释)

    一.数据库事务隔离级别 数据库事务的隔离级别有4个,由低到高依次为Read uncommitted .Read committed .Repeatable read .Serializable ,这四 ...

  8. 事务的4种隔离级别,3大问题,脏读幻读不可重复读

    一.数据库事务隔离级别 数据库事务的隔离级别有4个,由低到高依次为Read uncommitted .Read committed .Repeatable read .Serializable ,这四 ...

  9. 数据库几个事务相关的知识点(脏读幻读不可重复读以及如何避免)

    0. 设置MYSQL的隔离界别 # 查询数据库当前事务隔离级别 mysql> select @@global.transaction_isolation,@@transaction_isolat ...

  10. 脏读 幻读 不可重复读 及其解决方法

    一个事务读到另外一个事务还没有提交的数据,我们称之为脏读.解决方法:把事务隔离级别调整到READ COMMITTED 一个事务先后读取同一条记录,但两次读取的数据不同,我们称之为不可重复读.解决方法: ...

最新文章

  1. 图神经网络在生物医药领域的12项研究综述
  2. Selenium java环境搭建
  3. 小程序笔记一:基础设置
  4. mysql.max links_Mysql的max_allowed_packet设定
  5. spring 扫描所有_从Spring的几个阶段理解其工作过程
  6. 偶尔用得上的MySQL操作
  7. SAP GUI security setting on local file access
  8. EPSON 利用CCD图像处理包标定工具坐标系
  9. vue使用 xterm_为什么我坚持使用xterm
  10. 电脑java语言有什么用_Java语言是什么?_Java语言有什么优点
  11. ARM GIC-400 寄存器
  12. Linux中重定向的实验总结,Linux中重定向命令行的总结
  13. mysql查询id为偶数_MySQL中查询中位数?
  14. System.ConfigurationManager类用于对配置文件的读取
  15. 20170831_安装软件
  16. [转载] 全本张广泰——第九回 出世见师兄 广泰走江湖
  17. python 3des加密_Python 3DES 加密解密
  18. 虚拟机运行python_虚的解释|虚的意思|汉典“虚”字的基本解释
  19. microbit积木块菜单图标
  20. Quantopian自学笔记03

热门文章

  1. fpga如何约束走线_经验总结:FPGA时序约束的6种方法
  2. 可靠性编码之格雷码(Gray码)
  3. 压缩pdf文件,自行调节清晰度从而调节文件大小,切分pdf文件为多个小文件,控制每个文件大小
  4. 【邀您参加】Android大讲堂-Android游戏开发之捕鱼游戏
  5. android 百度地图描点,划线
  6. Minio分布式对象存储的部署与使用
  7. [Leetcode]5970. 参加会议的最多员工数
  8. HTML+CSS大作业——神偷奶爸(10页) HT简单个人网页设计作业 静态动漫主题网页作业 DW个人网站模板下载 大学生简单个人网页作品代码
  9. 【雷达成像】合成孔径雷达RD成像算法matlab仿真
  10. cad重新加载php命令,cad折断线命令是什么