一、数据库事务隔离级别

数据库事务的隔离级别有4个,由低到高依次为Read uncommitted 、Read committed 、Repeatable read 、Serializable ,这四个级别可以逐个解决脏读 、不可重复读 、幻读 这几类问题。

√: 可能出现    ×: 不会出现

脏读    不可重复读    幻读
Read uncommitted    √    √    √
Read committed    ×    √    √
Repeatable read    ×    ×    √
Serializable    ×    ×    ×

注意:我们讨论隔离级别的场景,主要是在多个事务并发 的情况下,因此,接下来的讲解都围绕事务并发。

Read uncommitted 读未提交
公司发工资了,领导把5000元打到singo的账号上,但是该事务并未提交,而singo正好去查看账户,发现工资已经到账,是5000元整,非常高 兴。可是不幸的是,领导发现发给singo的工资金额不对,是2000元,于是迅速回滚了事务,修改金额后,将事务提交,最后singo实际的工资只有 2000元,singo空欢喜一场。

出现上述情况,即我们所说的脏读 ,两个并发的事务,“事务A:领导给singo发工资”、“事务B:singo查询工资账户”,事务B读取了事务A尚未提交的数据。

当隔离级别设置为Read uncommitted 时,就可能出现脏读,如何避免脏读,请看下一个隔离级别。

Read committed 读提交
singo拿着工资卡去消费,系统读取到卡里确实有2000元,而此时她的老婆也正好在网上转账,把singo工资卡的2000元转到另一账户,并在 singo之前提交了事务,当singo扣款时,系统检查到singo的工资卡已经没有钱,扣款失败,singo十分纳闷,明明卡里有钱,为 何......

出现上述情况,即我们所说的不可重复读 ,两个并发的事务,“事务A:singo消费”、“事务B:singo的老婆网上转账”,事务A事先读取了数据,事务B紧接了更新了数据,并提交了事务,而事务A再次读取该数据时,数据已经发生了改变。

当隔离级别设置为Read committed 时,避免了脏读,但是可能会造成不可重复读。

大多数数据库的默认级别就是Read committed,比如Sql Server , Oracle。如何解决不可重复读这一问题,请看下一个隔离级别。

Repeatable read 重复读
当隔离级别设置为Repeatable read 时,可以避免不可重复读。当singo拿着工资卡去消费时,一旦系统开始读取工资卡信息(即事务开始),singo的老婆就不可能对该记录进行修改,也就是singo的老婆不能在此时转账。

虽然Repeatable read避免了不可重复读,但还有可能出现幻读 。

singo的老婆工作在银行部门,她时常通过银行内部系统查看singo的信用卡消费记录。有一天,她正在查询到singo当月信用卡的总消费金额 (select sum(amount) from transaction where month = 本月)为80元,而singo此时正好在外面胡吃海塞后在收银台买单,消费1000元,即新增了一条1000元的消费记录(insert transaction ... ),并提交了事务,随后singo的老婆将singo当月信用卡消费的明细打印到A4纸上,却发现消费总额为1080元,singo的老婆很诧异,以为出 现了幻觉,幻读就这样产生了。

注:Mysql的默认隔离级别就是Repeatable read。

Serializable 序列化
Serializable 是最高的事务隔离级别,同时代价也花费最高,性能很低,一般很少使用,在该级别下,事务顺序执行,不仅可以避免脏读、不可重复读,还避免了幻像读。

二、脏读、幻读、不可重复读

1.脏读:
脏读就是指当一个事务正在访问数据,并且对数据进行了修改,而这种修改还没有提交到数据库中,这时,另外一个事务也访问这个数据,然后使用了这个数据。

2.不可重复读:
是指在一个事务内,多次读同一数据。在这个事务还没有结束时,另外一个事务也访问该同一数据。那么,在第一个事务中的两次读数据之间,由于第二个事务的修改,那么第一个事务两次读到的的数据可能是不一样的。这样就发生了在一个事务内两次读到的数据是不一样的,因此称为是不可重复读。(即不能读到相同的数据内容)
例如,一个编辑人员两次读取同一文档,但在两次读取之间,作者重写了该文档。当编辑人员第二次读取文档时,文档已更改。原始读取不可重复。如果只有在作者全部完成编写后编辑人员才可以读取文档,则可以避免该问题。

3.幻读:
是指当事务不是独立执行时发生的一种现象,例如第一个事务对一个表中的数据进行了修改,这种修改涉及到表中的全部数据行。同时,第二个事务也修改这个表中的数据,这种修改是向表中插入一行新数据。那么,以后就会发生操作第一个事务的用户发现表中还有没有修改的数据行,就好象
发生了幻觉一样。
例如,一个编辑人员更改作者提交的文档,但当生产部门将其更改内容合并到该文档的主复本时,发现作者已将未编辑的新材料添加到该文档中。如果在编辑人员和生产部门完成对原始文档的处理之前,任何人都不能将新材料添加到文档中,则可以避免该问题。

幻读——PHANTON READ 
又称为虚度,是指在一个事务内,两次查询中数据条数不一致 
幻读和不可重复读类似,都是在两次查询过程中,区别,幻读是由于其他事务做了插入记录的操作,导致,记录条数有所增加

设置b账户的隔离级别 
B账户,由于,前面将事务的隔离级别设置为REPEATABLE READ——可重复读,这种隔离级别可以避免幻读的出现 
因此,需要将事务的隔离级别设置的更低,设置为READ COMMITTED

演示幻读
B账户,首先,在b账户中开启一个事务,在事务中查询账户的余额

A账户,在对a账户操作之前,查询当前账户中的信息

对a账户执行添加操作,a账户不用开启事务,直接执行添加操作

B账户,当a账户添加成功后,在b账户中,再次查询账户的余额

可以看出,第二次查询比第一次查询,多了一条记录 
这种情况不是错误的,但是,不符合实际需求,演示完成,将b账户中的事务提交

重新设置b账户的隔离级别 
B账户,为了防止出现幻读,将b账户的隔离级别设置为REPEATABLE READ

验证是否出现幻读
B账户,重新开启一个事务,查询当前账户的余额

A账户,进行添加操纵之前,先查看账户中的信息

对a账户执行添加操作,不开启事务,直接执行添加操作

B账户,当a账户执行完添加操作,再次,查询当前账户中的信息

可以看出,两次查询结果一致,在同一个事务中,两次的查询结果是一致的

因此,事务的隔离级别为REPEATABLE READ,可以避免幻读 
最后,使用commit提交当前事务,提交之后,查询账户的余额

可以看出,账户的信息已经修改,添加了一条新纪录

1. 首先,说说什么事务(Transaction)
事务,就是一组操作数据库的动作集合。事务是现代数据库理论中的核心概念之一。
如果一组处理步骤或者全部发生或者一步也不执行,我们称该组处理步骤为一个事务。
当所有的步骤像一个操作一样被完整地执行,我们称该事务被提交。
由于其中的一部分或多步执行失败,导致没有步骤被提交,则事务必须回滚到最初的系统状态。

2. spring七个事务传播属性:
1.PROPAGATION_REQUIRED – 支持当前事务,如果当前没有事务,就新建一个事务。这是最常见的选择。

2.PROPAGATION_SUPPORTS – 支持当前事务,如果当前没有事务,就以非事务方式执行。

3.PROPAGATION_MANDATORY – 支持当前事务,如果当前没有事务,就抛出异常。

4.PROPAGATION_REQUIRES_NEW – 新建事务,如果当前存在事务,把当前事务挂起。

5.PROPAGATION_NOT_SUPPORTED – 以非事务方式执行操作,如果当前存在事务,就把当前事务挂起。

6.PROPAGATION_NEVER – 以非事务方式执行,如果当前存在事务,则抛出异常。

7.PROPAGATION_NESTED – 如果当前存在事务,则在嵌套事务内执行。如果当前没有事务,则进行与PROPAGATION_REQUIRED类似的操作。

备注:常用的两个事务传播属性是1和4,即PROPAGATION_REQUIRED,PROPAGATION_REQUIRES_NEW

3. 五个隔离级别:
ISOLATION_DEFAULT 
这是一个PlatfromTransactionManager默认的隔离级别,使用数据库默认的事务隔离级别.

另外四个与JDBC的隔离级别相对应;

ISOLATION_READ_UNCOMMITTED 
这是事务最低的隔离级别,它充许别外一个事务可以看到这个事务未提交的数据。 
这种隔离级别会产生脏读,不可重复读和幻像读。

ISOLATION_READ_COMMITTED 
保证一个事务修改的数据提交后才能被另外一个事务读取。另外一个事务不能读取该事务未提交的数据。 
这种事务隔离级别可以避免脏读出现,但是可能会出现不可重复读和幻像读。

ISOLATION_REPEATABLE_READ 
这种事务隔离级别可以防止脏读,不可重复读。但是可能出现幻像读。 
它除了保证一个事务不能读取另一个事务未提交的数据外,还保证了避免下面的情况产生(不可重复读)。

ISOLATION_SERIALIZABLE 
这是花费最高代价但是最可靠的事务隔离级别。事务被处理为顺序执行。 
除了防止脏读,不可重复读外,还避免了幻像读。

关键词: 
1)幻读:事务1读取记录时事务2增加了记录并提交,事务1再次读取时可以看到事务2新增的记录; 
2)不可重复读取:事务1读取记录时,事务2更新了记录并提交,事务1再次读取时可以看到事务2修改后的记录; 
3)脏读:事务1更新了记录,但没有提交,事务2读取了更新后的行,然后事务T1回滚,现在T2读取无效。

脏读:指一个事务读取了一个未提交事务的数据

不可重复读:在一个事务内读取表中的某一行数据,多次读取结果不同.一个事务读取到了另一个事务提交后的数据.

虚读(幻读):在一个事务内读取了别的事务插入的数据,导致前后读取不一致(insert)

原文:https://blog.csdn.net/baidu_37107022/article/details/75578140 
原文:https://blog.csdn.net/nangeali/article/details/75578695 
原文:https://blog.csdn.net/jiesa/article/details/51317164

事务的4种隔离级别,3大问题,脏读幻读不可重复读相关推荐

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

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

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

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

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

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

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

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

  5. 事务的隔离级别演示-避免脏读,演示不可重复读发生

    避免脏读,演示不可重复读发生 开启两个窗口A,B 设置A窗口的隔离级别为read committed; SET SESSION TRANSACTION ISOLATION LEVEL read com ...

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

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

  7. 数据库事务的四种隔离级别

    文章目录 1. 引言 2. 事务隔离级别 2.1 事务四种隔离级别 2.2 查看隔离级别 3. 脏读/幻读/不可重复读 3.1 脏读 3.2 不可重复读 3.3 幻读 4. 总结: 1. 引言 &qu ...

  8. MySQL事务的四种隔离级别,mysql中的不可重复读和幻读的区别,Repeatable read可重复读隔离级别下怎么不存在幻读问题?

    1. 事务的隔离级别 1.1 read uncommited:读未提交.一个事务读到了另一个事务未提交的脏数据,称之为脏读. 1.2 read commited:读已提交.解决了脏读问题,但当前事务两 ...

  9. MySQL事务的4种隔离级别

    文章目录 1 简介 2 什么是数据库事务? 2.1 事务的四大特性(ACID) 3 并发事务会导致的问题 3.1 本文会使用到的 SQL 语句: 3.1.1 示例表结构 3.1.2 查询事务的默认隔离 ...

最新文章

  1. 利用牛顿法求平方根-Go语言实现
  2. ABAP 数字处理相关内容备注
  3. 短信自动转发到另一个手机_以 wmghz.com 为例,简单实现打一个网址自动就转到另一个网址...
  4. Linux操作系统下共享文件夹设置方法介绍
  5. 谷歌大脑Wasserstein自编码器:新一代生成模型算法
  6. SQLServer XML操作
  7. asterisk1.8 账号信息mysql存储(动态)
  8. vba上传文件到ftp服务器指定目录下面
  9. 关于AM335X移植SDIO WIFI的简易教程(转)
  10. Django 学习笔记之一 环境搭建
  11. MySql 不香了?我们公司为什么放弃MySql选择NewSql?
  12. 模拟人生 4:如何在游戏中生成收藏品
  13. 数据分析统计工具有哪些?
  14. 北京功略----玩水篇
  15. Python学习笔记—— 面向对象1. 面向对象基础
  16. 负反馈放大电路实验报告
  17. Performs recursive(递归) glob(全局) with given suffix and rootdir,使用os.walk(rootdir)和filename.endswith(s
  18. ORB-SLAM2学习笔记——BundleAdjustment函数
  19. Android根据音量大小绘制心电图(附源码)
  20. ffmpeg 图片转视频

热门文章

  1. 饥荒mod制作学习(1)
  2. B/S实现大视频上传
  3. android IReader打开书本,关闭书本动画的自定义控件(带源码)
  4. LeetCode Top-100 T70-爬楼梯
  5. T70 在线画流程图
  6. 老妈终于会用电脑了!
  7. CAD梦想画图中的“倒角命令”
  8. java编程300例:4.输出特定的表情符号
  9. iOS 底层原理之 类的原理分析(上)
  10. 高燃!GitHub上标星75k+超牛的Java面试突击版