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

  1. 脏读
    读取了未提交的事务。
    事务A读取了事务B中尚未提交的数据。如果事务B回滚,则A读取使用了错误的数据。
    解决:如果一个事务在读的时候,禁止读取未提交的事务。

  2. 不可重复读
    读取了提交的新事物,指更新操作。
    期望两次读的结果一样,但中途另一个事务修改了数据并提交了,导致第二次读的结果变了。
    解决:如果一个事务在读的时候,禁止任何事务写。

  3. 幻读
    也是读取了提交的新事物,指增删操作。
    不可重复是针对记录的update操作,只要在记录上加写锁,就可避免;幻读是对记录的insert操作,禁止幻读必须加上全局的写锁。比如在表上加写锁。

    例:事务A,先执行:update table set name="hky" where id > 3事务B,后执行,并且提交:insert into table values(11, 'uu')事务A,再select一下:select * from table where id > 3结果集:11,uu事务A懵了,我tm刚更新完id>3的啊?!幻觉?!

由此,也可以看出不可重复读和幻读区别,不可重复读操作是本身记录读取产生的,幻读则是一个范围。

二、事务隔离级别

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

  • Read uncommitted(读未提交)
    最低的隔离级别。一个事务可以读取另一个事务并未提交的更新结果。也就是会出现脏读。

  • Read Committed(读提交)
    大部分数据库采用的默认隔离级别。如oracle,写操作加写锁,读操作加读锁。
    一个事务的更新操作结果只有在该事务提交之后,另一个事务才可以的读取到同一笔数据更新后的结果。
    也就是一个事务开始读了,另一个事务开始写,读只能读到另个事务未提交之前的数据。

  • Repeatable Read(重复读)
    mysql的默认级别
    整个事务过程中,对同一批数据的读取结果是相同的,不管其他事务是否在对共享数据进行更新,也不管更新提交与否。

    这里涉及到一个问题,例如mysql,那innoDB是怎么解决幻读的?
    mysql默认级别RR下,innoDB使用MVCC和next-key locks解决幻读。MVCC解决的是普通读(快速读)的幻读,next-key locks解决的是当前读情况下的幻读。

    (1) 当前读:
    所谓当前读,是指加锁的select,update,delete等语句。在RR事务隔离级别下,数据库会使用next-key locks来锁住本条记录及索引区间。
    以上述幻读的例子来说,在RR情况下,假设使用的是当前读,加锁了读select * from table where id>3 ,锁住的就是id=3这条记录及id>3这条区间范围,锁住索引记录之间的范围,避免范围内插入记录,避免产生幻读行记录。

    (2) 普通读:
    普通读是不加锁的读,解决幻读的手段是MVCC。
    MVCC会给每行元组加一些辅助字段,记录创建版本号和删除版本号。
    而每个事务在启动的时候,都有一个唯一的递增的版本号。开启新事务,事务版本号就会递增。

    • SELCT
      读取创建版本小于或等于当前事务版本号,并且删除版本为空或大于当前事务版本号的记录。这样就可以保证在读取之前记录是存在的。
    • INSERT
      将当前事务的版本号保存至行的创建版本号
    • UPDATE
      新插入一行,并以当前事务的版本号作为新行的创建版本号,同时将原记录行的删除版本号设置为当前事务版本号。
    • DELETE
      将当前事务的版本号保存至行的删除版本号

    具体参考链接:
    https://mp.weixin.qq.com/s/GoJIYQqqiNBamFnwiFoRXw
    https://www.cnblogs.com/wudanyang/p/10655180.html

  1. Serializable(序列化)
    最高隔离级别。所有事务操作依次顺序执行。注意这会导致并发度下降,性能最差。通常会用其他并发级别加上相应的并发锁机制来取代它。

数据库隔离级别解决脏读、不可重复读、幻读相关推荐

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

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

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

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

  3. 关于数据库隔离级别为RR(可重复读)下是否解决幻读问题

    一.数据库隔离级别 隔离级别 脏读可能性 不可重复读可能性 幻读可能性 加锁读 READ UNCOMMITTED 是 是 是 否 READ COMMITTED 否 是 是 否 REPEATABLE R ...

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

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

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

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

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

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

  7. Mysql默认隔离级别为什么是可重复读?

    知识点总结 1.数据库默认隔离级别: mysql -可重复读: oracle,postgres -已提交读 2.mysql binlog的格式三种:statement,row,mixed 3.为什么m ...

  8. [转]为什么mysql默认隔离级别设置为可重复读

    一般的DBMS系统,默认都会使用读提交(Read-Comitted,RC)作为默认隔离级别,如Oracle.SQLServer等,而MySQL却使用可重复读(Read-Repeatable,RR).要 ...

  9. 专题-子项-1-mysqlf-默认隔离级别为什么是可重复读?为什么业务代码建议用读已提交?

    经典参考:https://blog.csdn.net/java_collect/article/details/105042975 binlog有几种格式? 三种,分别是 ----statement: ...

最新文章

  1. Java项目:家教管理系统(java+SSM+MyBatis+MySQL+Maven+Jsp)
  2. Windows Azure Mobile Services增加了对 Android的支持并扩展其适用范围至东亚地区
  3. 区块链:这项颠覆性技术将如何改变未来
  4. 乐观锁和悲观锁,可重入锁和不可重入锁(1)
  5. IIS不能下载.apk文件
  6. wps定位对话框快捷键_Word、Excel、PPT快捷键汇总
  7. ubuntu 搜索文件方法(find命令)
  8. Immutable 想破坏它也没办法
  9. aquamacs 夜间模式禁止滚动条
  10. HTML 5 的自定义 data-* 属性和jquery的data()方法的使用
  11. dagger2 注入_Android依赖注入– Dagger 2
  12. [USACO2006][poj3182]The Grove(巧妙的BFS)
  13. Sentinel 实战-控制台篇
  14. 黑莓8900刷机教程 即黑莓如何刷机
  15. 为什么TIME_WAIT状态是2MSL?(2个原因)
  16. 【起航计划ObjC 002】印第安老斑鸠ObjC的幻想 ---- Ubuntu下安装并使用MAC虚拟机
  17. 电赛校赛总结----一维板球系统【代码开源】
  18. 【Linux C】进程、线程和进程间通信
  19. 《 Python List 列表全实例详解系列(八)》__随机列表元素
  20. Origin Pro2017 不等间距图

热门文章

  1. 2022金三银四面试总结-Java高级篇
  2. 给Android新手的六条建议,听说安卓不火了?
  3. SM2国密算法加解密
  4. 如何制作电子画册?教你快速上手 | 云展网
  5. android touch事件无反应,触摸屏 无响应
  6. ORACLE 碎片整理小结
  7. 获取微信小程序页面路径【保姆级教程】
  8. 本文将要讨论Objective-C中的方法替换(method replacement)和swizzling(移魂大法)。
  9. 科技爱好者周刊:第 72 期
  10. Motorola(二)