当然, 从总的结果来看, 似乎两者都表现为两次读取的结果不一致.

但如果你从控制的角度来看, 两者的区别就比较大
对于前者, 只需要锁住满足条件的记录
对于后者, 要锁住满足条件及其相近的记录


我这么理解是否可以?
避免不可重复读需要锁行就行强调内容
避免幻影读则需要锁表


不可重复读和幻读的区别

很多人容易搞混不可重复读和幻读,确实这两者有些相似。但不可重复读重点在于update和delete,而幻读的重点在于insert。

如果使用锁机制来实现这两种隔离级别,在可重复读中,该sql第一次读取到数据后,就将这些数据加锁,其它事务无法修改这些数据,就可以实现可重复 读了。但这种方法却无法锁住insert的数据,所以当事务A先前读取了数据,或者修改了全部数据,事务B还是可以insert数据提交,这时事务A就会 发现莫名其妙多了一条之前没有的数据,这就是幻读,不能通过行锁来避免。需要Serializable隔离级别 ,读用读锁,写用写锁,读锁和写锁互斥,这么做可以有效的避免幻读、不可重复读、脏读等问题,但会极大的降低数据库的并发能力。

所以说不可重复读和幻读最大的区别,就在于如何通过锁机制来解决他们产生的问题。

上文说的,是使用悲观锁机制来处理这两种问题,但是MySQL、ORACLE、PostgreSQL等成熟的数据库,出于性能考虑,都是使用了以乐观锁为理论基础的MVCC(多版本并发控制)来避免这两种问题。

悲观锁和乐观锁

悲观锁
正如其名,它指的是对数据被外界(包括本系统当前的其他事务,以及来自外部系统的事务处理)修改持保守态度,因此,在整个数据处理过程中,将数据处 于锁定状态。悲观锁的实现,往往依靠数据库提供的锁机制(也只有数据库层提供的锁机制才能真正保证数据访问的排他性,否则,即使在本系统中实现了加锁机 制,也无法保证外部系统不会修改数据)。

在悲观锁的情况下,为了保证事务的隔离性,就需要一致性锁定读。读取数据时给加锁,其它事务无法修改这些数据。修改删除数据时也要加锁,其它事务无法读取这些数据。

乐观锁
相对悲观锁而言,乐观锁机制采取了更加宽松的加锁机制。悲观锁大多数情况下依靠数据库的锁机制实现,以保证操作最大程度的独占性。但随之而来的就是数据库性能的大量开销,特别是对长事务而言,这样的开销往往无法承受。

而乐观锁机制在一定程度上解决了这个问题。乐观锁,大多是基于数据版本( Version )记录机制实现。何谓数据版本?即为数据增加一个版本标识,在基于数据库表的版本解决方案中,一般是通过为数据库表增加一个 “version” 字段来实现。读取出数据时,将此版本号一同读出,之后更新时,对此版本号加一。此时,将提交数据的版本数据与数据库表对应记录的当前版本信息进行比对,如 果提交的数据版本号大于数据库表当前版本号,则予以更新,否则认为是过期数据。

要说明的是,MVCC的实现没有固定的规范,每个数据库都会有不同的实现方式,这里讨论的是InnoDB的MVCC。

参考==>http://tech.meituan.com/innodb-lock.html

转载自:http://www.cnblogs.com/itcomputer/articles/5133254.html

不可重复读和幻读的区别(悲观锁和乐观锁)相关推荐

  1. 事务相关、不可重复读与幻读的区别

    前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家.点击跳转到教程. 事务内嵌套事务:   1) 都用spring事务时,取决spring采用的事务的隔离级别.     ...

  2. Spring事务配置的五种方式和spring里面事务的传播属性和事务隔离级别、不可重复读与幻读的区别

    前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家.点击跳转到教程. spring事务配置的五种方式 前段时间对Spring的事务配置做了比较深入的研究,在此之间对Spr ...

  3. 不可重复读和幻读的区别_图解脏写、脏读、不可重复读、幻读

    MySQL 是支持多事务并发执行的,否则来一个请求处理一个请求,处理一个人请求的时候,别的人都等着,这网站就别做了,用户都要砸键盘了. 这里就有一个问题了:一个事务在写数据的时候,另一个事务要读这行数 ...

  4. 数据库不可重复读和幻读的区别

    不可重复读:事务A第一次读取数据,事务B对同一个表进行了update 或者delete,事务A第二次读取数据,那么两次读取的数据是不同的,这时是不可重复读. 幻读:事务A第一次读取数据,事务B对同一个 ...

  5. 脏写、脏读、不可重复读、幻读的区别

    一般对于我们的业务系统去访问数据库而言,它往往是多个线程并发执行多个事务的,对于数据库而言,它会有多个事务同时执行,可能这多个事务还会同时更新和查询同一条数据,所以这里会有一些问题需要数据库来解决 我 ...

  6. 不可重复读和幻读的区别_面试官:MySQL的可重复读级别能解决幻读吗

    Java面试笔试面经.Java技术每天学习一点 Java面试 关注不迷路 作者:宁愿. 来源:https://juejin.im/post/5c9040e95188252d92095a9e 引言 之前 ...

  7. 不可重复读和幻读的区别

    不可重复读是因为在读的时候没有禁止写操作,两次读取同一条数据的时候结果不一致,主要针对的是update或delete 幻读是因为在读取多条数据时,虽然此时读操作禁止了写操作,所以update和dele ...

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

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

  9. 不可重复读和幻读的区别_论文重复率要多少算是合格的?

    论文重复率要多少算是合格的?对于论文查重的重复率要求,每个学校都是有一定差异的,部分高校要求比较简单,论文重复率只需要控制在20%-30%左右就可以了,而有些高校,对论文的重复率把控非常严格,明确规定 ...

  10. 脏读,不可重复读,幻读

    MySQL事务隔离级别: 在介绍脏读,不可重复读,幻读现象之前,我们先来了解MySQL的事务隔离级别,因为脏读,不可重复读,幻读等现象都是由数据库里的事务隔离级别来决定是否可能发生的. 在MySQL里 ...

最新文章

  1. Java游戏地下城_地下城与勇士DNF-鬼剑士
  2. sql查询索引语句_sql优化总结--基于sql语句优化和索引优化
  3. java 同步的方法_关于Java中的同步方法
  4. 让程序间隔执行并可以停止
  5. 微服务实践 | 网易考拉海购Dubbok框架优化详解
  6. 计算机组成原理(第三版)唐朔飞-第四章存储器-课后习题
  7. 安卓性能优化全面总结(友盟性能优化大赛获奖作品)
  8. nginx配置导致ios上传不了图片
  9. 20162328WJH实验五网络编程与安全实验报告
  10. Python3对股票数据进行分析
  11. pandas之表格条件格式设置
  12. 技术干货 | 如何用MindSpore优化器加速收敛高度逼近最优值?
  13. 2018及过去20年诺贝尔化学奖获奖者及其贡献!
  14. 数学定理【转自百度百科】
  15. 微信公众号文章怎么搞成html,微信公众号文章如何排版才能更好看(附教程)...
  16. 科技爱好者周刊(第 151 期):NFT 是什么,听说能赚钱
  17. python 类 实例_Python类的实例详解
  18. 事业单位计算机技术岗工资,事业单位管理岗和技术岗工资区别,不得不知!
  19. HAProxy入门(一)
  20. centos5安装nagios

热门文章

  1. 成都盛铭轩:商品质量分怎么提升
  2. Linux系统无法在spyder5中输入中文的解决办法
  3. DRAM知识整理系列(三):部分时序参数整理
  4. 如何让企业微信的消息在微信里显示?
  5. 基础算法练习200题07、编框
  6. 路由器450m和1200m有什么区别
  7. springboot接入微信,支付宝支付
  8. 2020 年 9 月程序员平均工资 14469 元,你拖后腿了没?
  9. 说一说Qpython3在Android手机上的应用
  10. VirtualBox增强功能无法安装