一、数据库的脏读、不可重复读和幻读

1、脏读: (读取了未提交的新事物,然后被回滚了
事务A读取了事务B中尚未提交的数据。如果事务B回滚,则A读取使用了错误的数据。

比如我给你转了100万,但是我还没有提交,此时你查询自己账户,多了100万,很开心。然后我发现转错人了,回滚了事物。然后你100万就没了。 在过程中你查到了没有提交事物的数据(多出的100万),这就是脏读。

解决:如果一个事物在读的时候,禁止读取未提交的事物。是不是就解决了。
2、不可重复读: (读取了提交的新事物,指更新操作
不可重复读是指在对于数据库中的某个数据,一个事务范围内多次查询却返回了不同的数据值,这是由于在查询间隔,被另一个事务修改并提交了。
不可重复读和脏读的区别是,脏读是某一事务读取了另一个事务未提交的脏数据,而不可重复读则是读取了前一事务提交的数据。
在某些情况下,不可重复读并不是问题,比如我们多次查询某个数据当然以最后查询得到的结果为主。但在另一些情况下就有可能发生问题,例如同一个事物前后两次查询同一个数据,期望两次读的内容是一样的,但是因为读的过程中,因为令一个数据写了该数据,导致不可重复读。(解决:如果 一个事物在读的时候,禁止任何事物写)
3、幻读:(也是读取了提交的新事物,指增删操作
在事务A多次读取构成中,事务B对数据进行了新增操作,导致事务A多次读取的数据不一致。
幻读和不可重复读的区别在于,不可重复是针对记录的update操作,只要在记录上加写锁,就可避免;幻读是对记录的insert操作,要禁止幻读必须加上全局的写锁(比如在表上加写锁)。

另外说一下两类丢失更新:
第一类事物丢失:(称为回滚丢失
对于第一类事物丢失,就是比如A和B同时在执行一个数据,然后B事物已经提交了,然后A事物回滚了,这样B事物的操作就因A事物回滚而丢失了。

举个例子,比如我又1000元。买一个东西,花了100元。然后我朋友给我转了1000元。理论上这两个事物正常的话,我应该还有1900元。

但是比如现在两个A,B事物同时进行,第一步都先查询我余额还有1000元,然后B事物给我转了1000元,提交了,理论上我还有2000元。然后我买东西,100元的,买到一半,我事物回滚,就回滚成了1000元。(回滚丢失)如果我不回滚,也提交了,我就还剩900元(也就是下面介绍的第二类事物丢失,覆盖丢失)。

第二类事物丢失:(提交覆盖丢失
对于第二类事物丢失,也称为覆盖丢失,就是A和B一起执行一个数据,两个同时取到一个数据,然后B事物首先提交,但是A事物加下来又提交,这样就覆盖了B事物,称为第二类事物丢失,覆盖丢失。
解决:如果一个事物加上表级锁,只要有任何东西操作这个表的时候,禁止任何操作的并发)

二、数据库的四种隔离级别(并发事务)

1、可读取未提交(Read uncommitted)
写事务阻止其他写事务,避免了更新遗失。但是没有阻止其他读事务。
存在的问题:脏读。即读取到不正确的数据,因为另一个事务可能还没提交最终数据,这个读事务就读取了中途的数据,这个数据可能是不正确的。

解决办法就是下面的“可读取确认”。

2、可读已提交(Read committed)
Sql Server , Oracle的默认隔离级别
写事务会阻止其他读写事务。读事务不会阻止其他任何事务。
存在的问题:不可重复读。即在一次事务之间,进行了两次读取,但是结果不一样,可能第一次id为1的人叫“李三”,第二次读id为1的人就叫了“李四”。因为读取操作不会阻止其他事务。
解决办法就是下面的“可重复读”。
3、可重复读(Repeatable read)
MySQL的默认隔离级别
读事务会阻止其他写事务,但是不会阻止其他读事务。
存在的问题:幻读。可重复读阻止的写事务包括update和delete(只给存在的表加上了锁),但是不包括insert(新行不存在,所以没有办法加锁),所以一个事务第一次读取可能读取到了10条记录,但是第二次可能读取到11条,这就是幻读。
解决办法就是下面的“串行化”。

4、序列化(Serializable)
可避免幻读。读加共享锁,写加排他锁。这样读取事务可以并发,但是读写,写写事务之间都是互斥的,基本上就是一个个执行事务,所以叫序列化。

三、数据库中事务的四大特性

1、原子性(Atomicity)
原子性是指事务包含的所有操作要么全部成功,要么全部失败回滚,这和前面两篇博客介绍事务的功能是一样的概念,因此事务的操作如果成功就必须要完全应用到数据库,如果操作失败则不能对数据库有任何影响。

2、一致性(Consistency)
一致性是指事务必须使数据库从一个一致性状态变换到另一个一致性状态,也就是说一个事务执行之前和执行之后都必须处于一致性状态。

拿转账来说,假设用户A和用户B两者的钱加起来一共是5000,那么不管A和B之间如何转账,转几次账,事务结束后两个用户的钱相加起来应该还得是5000,这就是事务的一致性。

3、隔离性(Isolation)
隔离性是当多个用户并发访问数据库时,比如操作同一张表时,数据库为每一个用户开启的事务,不能被其他事务的操作所干扰,多个并发事务之间要相互隔离。

即要达到这么一种效果:对于任意两个并发的事务T1和T2,在事务T1看来,T2要么在T1开始之前就已经结束,要么在T1结束之后才开始,这样每个事务都感觉不到有其他事务在并发地执行。

关于事务的隔离性数据库提供了多种隔离级别,稍后会介绍到。

4、持久性(Durability)
持久性是指一个事务一旦被提交了,那么对数据库中的数据的改变就是永久性的,即便是在数据库系统遇到故障的情况下也不会丢失提交事务的操作。

例如我们在使用JDBC操作数据库时,在提交事务方法后,提示用户事务操作完成,当我们程序执行完成直到看到提示后,就可以认定事务以及正确提交,即使这时候数据库出现了问题,也必须要将我们的事务完全执行完成,否则就会造成我们看到提示事务处理完毕,但是数据库因为故障而没有执行事务的重大错误。
  
参考文章
https://www.cnblogs.com/fjdingsd/p/5273008.html
https://blog.csdn.net/qq360514136/article/details/88287442
https://blog.csdn.net/qq_35206244/article/details/82493215
https://www.iteye.com/blog/uule-1109647

数据库的脏读、不可重复读、幻读以及四种隔离级别相关推荐

  1. 脏读,不可重复读,幻读区别

    脏读 脏读又称无效数据读出.一个事务读取另外一个事务还没有提交的数据叫脏读. 例如:事务T1修改了一行数据,但是还没有提交,这时候事务T2读取了被事务T1修改后的数据,之后事务T1因为某种原因Roll ...

  2. mysql 脏读 不可重复读 幻读_mysql事务隔离级别/脏读/不可重复读/幻读详解

    一.四种事务隔离级别 1.1read uncommitted 读未提交 即:事务A可以读取到事务B已修改但未提交的数据. 除非是文章阅读量,每次+1这种无关痛痒的场景,一般业务系统没有人会使用该事务隔 ...

  3. mysql不可重复读和重复读_MySql隔离级别:RU / RC / RR / S + 脏读 / 不可重复读 / 幻读 / 可重复读...

    MySQL 事务 本文所说的 MySQL 事务都是指在 InnoDB 引擎下,MyISAM 引擎是不支持事务的. 数据库事务指的是一组数据操作,事务内的操作要么就是全部成功,要么就是全部失败,什么都不 ...

  4. oracle 脏读,脏读 不可重复读 幻读

    序言 脏读.不可重复读.幻读这几个概念开始接触和学习的时候是在大学学习数据库系统的时候,那时候对这几个专业名词的理解停留在概念文字上,并没有真正使用过实践中,最近工作中涉及到这几个概念方面的知识,就来 ...

  5. 脏读,不可重复读,幻读区别和避免

    在了解脏读,不可重复度,幻读之前,首先要明白这三种情况的出现都是和数据库并发事务有关联的,如果所有的读写都按照队列的形式进行,就不会出现问题. 名词解析和解决方案 脏读 脏读又称无效数据读出(读出了脏 ...

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

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

  7. 数据库(Mysql)的四种隔离级别

    数据库事务的隔离级别有4种,由低到高分别为Read uncommitted .Read committed .Repeatable read .Serializable .而且,在事务的并发操作中可能 ...

  8. MySQL数据库的四种隔离级别

    一.首先介绍几个概念: 1,脏读: 又称无效数据的读出,是指在数据库访问中,事务T1将某一值修改但是还未提交,然后事务T2读取该值,此后T1因为某种原因撤销对该值的修改并提交,这就导致了T2所读取到的 ...

  9. 一文搞懂数据库的四种隔离级别(建议收藏)

    文章转载自老周聊架构,侵删!!! 一.什么是事务 事务是应用程序中一系列严密的操作,所有操作必须成功完成,否则在每个操作中所作的所有更改都会被撤消.也就是事务具有原子性,一个事务中的一系列的操作要么全 ...

最新文章

  1. “期待已久的UFO报告”公布了
  2. 从零开始数据科学与机器学习算法-KNN分类算法-07
  3. 随时随地以任意方式编写 .NET 应用程序
  4. linux android sdk gengxinman,Android 实现增量更新
  5. 聊聊微服务架构及分布式事务解决方案
  6. 在VM2008R2中使用模板快速创建虚拟机之一准备篇
  7. 双系统如何在Centos7中添加GRUB2启动项
  8. python怎么读-Python中怎么读写文件
  9. php 跨天 时间差 秒,判断时间是否在预设跨天时段
  10. Linux内核参数优化网络带宽,基于Linux内核的网络带宽管理
  11. ElasticSearch6.0.1 拼音搜索,并且高亮显示结果 —6.X版本
  12. 《晨间日记的奇迹读》书笔记
  13. JAVASE基础知识栈梳理
  14. Fragment already added问题的解决
  15. [安装之1] dell设置从ssd启动_如何进bios设置ssd固态硬盘为第一启动
  16. 区块链数据资源网站总结
  17. Kuboardv3与监控套件安装
  18. Android BLE 蓝牙开发指南(三)外围设备端开发详解
  19. 篮球大数据公司贝泰科技完成A轮融资 投后估值8500万
  20. vs2012运行项目报未能加载文件或程序集“System.Web.Mvc, Version=4.0.0.1,Culture=neutral”问题和解决方法...

热门文章

  1. Ta-Lib源码解析(一):交叉指标(Overlap Studies) #(附Python重构代码)
  2. 修改科汛CMS团购功能 修改往期团购显示
  3. 逆商AQ(AdversityQuotient)
  4. 【单片机笔记】基于XL4015的可调电源
  5. 海光信息将于科创板上市:估值900亿,争夺“国产CPU第一股”
  6. 1.无监督学习概述: 生成学习VS对比学习
  7. PING 怎么知道网络速度
  8. linux用终端播放视频,如何在 Linux 中使用 Asciinema 进行录制和回放终端会话
  9. Linux 切换显卡后显示屏输入不支持的解决办法
  10. 忘记交换机Console口密码怎么办