目录

  • 一、前言
    • 1.1、4种事务隔离级别
    • 1.2、3种读现象
  • 二、举例说明
    • 2.1、读未提交
    • 2.2、读已提交
    • 2.3、可重复读
    • 2.4、串行化

一、前言

本文主要对4种事务隔离级别,具体举例说明各自可能会存在的3种读现象的问题。

1.1、4种事务隔离级别

什么是隔离?
因为AB两事务存在时空冲突性,即执行时间和操作记录上都存在交集,否则就可以认为是不相关的,没有必要隔离。
那么4种事务隔离级别各自是什么,下面列出:

  • 读未提交,READ_UNCOMMITTED,事务A可读到另一事务B未提交的变化。存在脏读、不可重复读、幻读问题。
  • 读已提交,READ_COMMITTED,事务A在事务B提交后才可以读到B提交的变化。存在不可重复读、幻读问题。
  • 可重复读,REPEATABLE_READ,事务A在事务B提交前后的两次读是一致的。存在幻读问题。
  • 串行化,SERIALIZABLE,最高隔离级别,若事务AB操作有冲突,则AB竞争锁串行执行。

1.2、3种读现象

这里对脏读不可重复读幻读问题,各自举例描述。

  • 脏读,Dirty Read,事务A读到了无效的脏数据。
  • 不可重复读,Non-repeatable Read,事务A第一次读到了存在的某条记录,后面又读该记录(被事务B对刚刚存在的该记录update或delete),两次结果不一致。
  • 幻读,Phantom Read,事务A第一次读到了某些结果集的数据,后面再次读,却读到了第一次中不存在的数据(被事务B在符合A第一次查询where条件的结果集中,insert了新的记录),两次结果不一致。

不可重复读和幻读,一般都是一个事务受到其他事务的影响,导致自身事务前后两次读结果不一致。
但是区别在于,不可重复读强调对先前存在的记录进行操作(对已存在的记录操作只能是update或delete),而幻读则强调对先前不存在的记录进行操作(对不存在的记录操作也只能是insert)。

二、举例说明

在这里逐个举例说明各个事务隔离级别可能存在的读问题。
查看Spring中@Transactional属性Isolation的注释也可以发现,读未提交存在脏读、不可重复读、幻读,读已提交存在不可重复读、幻读,可重复读存在幻读,串行化防止脏读、不可重复读、幻读。

ps,点击这篇数据库事务隔离级别举例详解(续)可以通过操作层面看到这些读问题。

下面的举例假设事务A、B一起执行。

2.1、读未提交

  • 脏读:
    时刻1,事务B修改Jay的工资由1爽(爽:货币计量单位,等于1.6亿元人民币)变为2爽,但还没提交;
    时刻2,事务A是可以读到Jay的工资变成2爽;
    时刻3,事务B试图提交但失败,导致回滚为1爽,那事务A读到的2爽就是脏数据,这就是一次脏读。

  • 不可重复读(update的影响):
    时刻1,事务A读到了Jay的工资是1爽;
    时刻2,事务B更改了Jay的工资为2爽,但还没提交;
    时刻3,事务A再读,这次读到2爽没问题,那事务A先后读到了同一记录的2种数据版本,这就是一次update导致的不可重复读。

  • 不可重复读(delete的影响):
    时刻1,事务A读到了Jay的工资是1爽;
    时刻2,事务B删除Jay的工资记录,但还没提交;
    时刻3,事务A再读,这次读不到Jay的工资记录,那也等同于事务A先后读到了同一记录的2种数据版本,这是一次delete导致的不可重复读。

  • 幻读:
    时刻1,事务A读到了Jay的工资有一条记录(select salary from pay_sheet where name=‘Jay’);
    时刻2,事务B在薪资表pay_sheet中为Jay添加了一项额外的薪酬,但还没提交;
    时刻3,事务A再查,这次查到莫名其妙多了一条记录,那事务A第二次的多读,就是一次insert导致的幻读。

2.2、读已提交

  • 不可重复读(update的影响):
    时刻1,事务A读到了Jay的工资是1爽;
    时刻2,事务B更改了Jay的工资为2爽,且已提交;
    时刻3,事务A再读,这次读到2爽没问题,那事务A先后读到了同一记录的2种数据版本,这就是一次update导致的不可重复读。

  • 不可重复读(delete的影响):
    时刻1,事务A读到了Jay的工资是1爽;
    时刻2,事务B删除Jay的工资记录,且已提交;
    时刻3,事务A再读,这次读不到Jay的工资记录,那也等同于事务A先后读到了同一记录的2种数据版本,这是一次delete导致的不可重复读。

  • 幻读:
    时刻1,事务A读到了Jay的工资有一条记录(select salary from pay_sheet where name=‘Jay’);
    时刻2,事务B在薪资表pay_sheet中为Jay添加了一项额外的薪酬,且已提交;
    时刻3,事务A再查,这次查到莫名其妙多了一条记录,那事务A第二次的多读,就是一次insert导致的幻读。

2.3、可重复读

  • 幻读:
    时刻1,事务A读到了Jay的工资有一条记录(select salary from pay_sheet where name=‘Jay’);
    ⚠️注意:这时候可重复读会将读到的这些记录行加锁,事务B没法去修改删除,但对事务B进行insert就没办法了,锁起不了作用。
    时刻2,事务B在薪资表pay_sheet中为Jay添加了一项额外的薪酬,且已提交;
    时刻3,事务A再查,这次查到莫名其妙多了一条记录,那事务A第二次的多读,就是一次insert导致的幻读。

2.4、串行化

串行化通过读写锁,读写写读写写互斥,读读不互斥的锁机制,牺牲数据库的并发性能,避免了脏读、不可重复读和幻读的问题。

数据库事务隔离级别举例详解相关推荐

  1. mysql讲事物写到数据库_CookBook/1-MySQL数据库读写锁示例详解、事务隔离级别示例详解.md at master · Byron4j/CookBook · GitHub...

    MySQL数据库读写锁示例详解.事务隔离级别示例详解 锁 性能分:乐观(比如使用version字段比对,无需等待).悲观(需要等待其他事务) 乐观锁,如它的名字那样,总是认为别人不会去修改,只有在提交 ...

  2. 一文带你轻松搞懂事务隔离级别(图文详解)

    本文由 SnailClimb 和读者 BugSpeak 共同完成. 事务隔离级别(图文详解) 什么是事务? 事务是逻辑上的一组操作,要么都执行,要么都不执行. 事务最经典也经常被拿出来说例子就是转账了 ...

  3. java 一个大事务下的新增、修改、查询_一文带你轻松搞懂事务隔离级别(图文详解)...

    点击上方"linkoffer", 选择关注公众号高薪职位第一时间送达 本文由 SnailClimb 和读者 BugSpeak 共同完成. 事务隔离级别(图文详解) 什么是事务? 事 ...

  4. 事务隔离级别(图文详解)

    事务隔离级别(图文详解) 什么是事务? 事务是逻辑上的一组操作,要么都执行,要么都不执行. 事务最经典也经常被拿出来说例子就是转账了.假如小明要给小红转账1000元,这个转账会涉及到两个关键操作就是: ...

  5. Mysql有四种事务隔离级别,详解脏读、不可重复读、幻读

    Mysql的事务隔离级别 Mysql有四种事务隔离级别,这四种隔离级别代表当存在多个事务并发冲突时,可能出现的脏读.不可重复读.幻读的问题. 脏读 大家看一下,我们有两个事务,一个是 Transact ...

  6. mysql 默认事务隔离级别_详解MySQL事务的四大特性和隔离级别

    1.事务的四大特性(ACID) 1.1.原子性(Atomicity) 原子性是指事务包含的一系列操作要么全部成功,要么全部回滚,不存在部分成功或者部分回滚,是一个不可分割的操作整体. 1.2.一致性( ...

  7. 数据库--事务的ACID--介绍/详解

    原文网址:数据库--事务的ACID--介绍/详解_IT利刃出鞘的博客-CSDN博客 简介 本文介绍数据库的事务的ACID. 事务具有ACID四个特性:原子性(Atomic).一致性(Consisten ...

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

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

  9. 数据库事务隔离级别+Spring 声明性事务隔离级别

    数据库事务隔离级别 数据库提供了四种事务隔离级别, 不同的隔离级别采用不同的锁类开来实现. 在四种隔离级别中, Serializable的级别最高, Read Uncommited级别最低. 大多数数 ...

最新文章

  1. C++集成开发环境(IDE)的优点
  2. linux系统/etc目录内容简介
  3. [深入学习C#]C#实现多线程的方式:使用Parallel类
  4. java list.add()与list.addAll()方法
  5. BlinkOn9 - Viz Update
  6. php5.6 交叉编译,Cross-compile - 龙芯开源社区
  7. 新手指南:我应该学哪种编程语言?
  8. select poll 与epoll模型的总结
  9. jdk8永久代从方法区移除的验证
  10. UVA - 10061 How many zero#39;s and how many digits ?
  11. tcp套接字编程模型
  12. Clojure 学习入门(14)- 循环控制
  13. MySQL-快速入门(6)连接查询、子查询、正则表达式查询、数据的插入删除更新...
  14. DNS、NS、DDNS
  15. 代码:灰度重心法提取线激光条纹中心线(CPP+OpenCV)
  16. 内存带宽测试与AVX指令集读写内存
  17. 连读、变音、失音、浊化、弱读、节奏
  18. booting from hard disk
  19. HTML5自动换行的间距设置,设置EXCEL自动换行的行与行之间的间距的办法
  20. stm32驱动Lora串口模块

热门文章

  1. 权限管理-chattr权限(通俗易懂)
  2. mysql授权某一列_mysql 数据库授权(给某个用户授权某个数据库)【转载】
  3. 小米分拆松果,芯片到底有多难做?
  4. linux killall
  5. Vizio一周使用感受
  6. 1.Hive系列之简介
  7. PC微信逆向:实现自动保存加密的聊天图片
  8. 苹果手机nfc怎么复制门禁卡
  9. 希沃鸿合文香一体机OPS电脑PC模块原厂预装教育系统镜像ESD打包封装驱动程序下载恢复盘构建
  10. 啊哈哈哈,2023年Python学习清单来喽;这清单都上齐了,怎么不收藏啊