目录

Read uncommitted 读未提交

Read committed 读提交

Repeatable read 重复读

Serializable 序列化

什么是脏读

重复读与幻读

隔离级别与锁的关系


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

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

脏读 不可重复读 幻读
Read uncommitted
Read committed--Sql Server , Oracle ×
Repeatable read--MySQL × ×
Serializable × × ×

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

Read uncommitted 读未提交

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

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

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

READ UNCOMMITTED是限制性最弱的隔离级别,因为该级别忽略其他事务放置的锁。使用READ UNCOMMITTED级别执行的事务,可以读取尚未由其他事务提交的修改后的数据值,这些行为称为“脏”读。这是因为在Read Uncommitted级别下,读取数据不需要加S锁,这样就不会跟被修改的数据上的X锁冲突。比如,事务1修改一行,事务2在事务1提交之前读取了这一行。如果事务1回滚,事务2就读取了一行没有提交的数据,这样的数据我们认为是不存在的。

Read committed 读提交

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

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

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

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

READ COMMITTED(Nonrepeatable reads)是SQL Server默认的隔离级别。该级别通过指定语句不能读取其他事务已修改但是尚未提交的数据值,禁止执行脏读。在当前事务中的各个语句执行之间,其他事务仍可以修改、插入或删除数据,从而产生无法重复的读操作,或“影子”数据。比如,事务1读取了一行,事务2修改或者删除这一行并且提交。如果事务1想再一次读取这一行,它将获得修改后的数据或者发现这一样已经被删除,因此事务的第二次读取结果与第一次读取结果不同,因此也叫不可重复读。

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

SERIALIZABLE 是限制性最强的隔离级别,因为该级别锁定整个范围的键,并一直持有锁,直到事务完成。该级别包括REPEATABLE READ,并增加了在事务完成之前,其他事务不能向事务已读取的范围插入新行的限制。比如,事务1读取了一系列满足搜索条件的行。事务2在执行SQL statement产生一行或者多行满足事务1搜索条件的行时会冲突,则事务2回滚。这时事务1再次读取了一系列满足相同搜索条件的行,第二次读取的结果和第一次读取的结果相同。

什么是脏读

脏读是指多个事务操作时,事务A读到了事务B尚未提交的数据。

脏读:事务T1更新了一行记录,还未提交所做的修改,这个T2读取了更新后的数据,然后T1执行回滚操作,取消刚才的修改,所以T2所读取的行就无效,也就是脏数据。

不可重复读

重复读是为了保证在一个事务中,相同查询条件下读取的数据值不发生改变,但是不能保证下次同样条件查询,结果记录数不会增加。

不可重复读取:事务T1读取一行记录,紧接着事务T2修改了T1刚刚读取的记录,然后T1再次查询,发现与第一次读取的记录不同,这称为不可重复读。

幻读

幻读主要针对插入的场景,就是同一个事务内,多次读取,读出的记录条数发生了变化。

幻想读:事务T1读取一条指定where条件的语句,返回结果集。此时事务T2插入一行新记录,恰好满足T1的where条件。然后T1使用相同的条件再次查询,结果集中可以看到T2插入的记录,这条新纪录就是幻想。

解决幻读的方式:

  • 采用SERIALIZABLE 隔离级别,但是性能比较差,并发性低
  • 查询是限定范围

隔离级别与锁的关系

  1. 在Read Uncommitted级别下,读操作不加S锁;
  2. 在Read Committed级别下,读操作需要加S锁,但是在语句执行完以后释放S锁;
  3. 在Repeatable Read级别下,读操作需要加S锁,但是在事务提交之前并不释放S锁,也就是必须等待事务执行完毕以后才释放S锁。
  4. 在Serialize级别下,会在Repeatable Read级别的基础上,添加一个范围锁。保证一个事务内的两次查询结果完全一样,而不会出现第一次查询结果是第二次查询结果的子集。

数据库隔离级别---MySQL的默认隔离级别就是Repeatable,Oracle默认Read committed,最高级别Serializable相关推荐

  1. java 一个大事务下的新增、修改、查询_重新学习Mysql数据库8:MySQL的事务隔离级别实战...

    本文转自:https://blog.csdn.net/sinat_27143551/article/details/80876127 本系列文章将整理到我在GitHub上的<Java面试指南&g ...

  2. MySQL 事务默认隔离级别?能否解决幻读?

    事务隔离级别 MySQL 中事务隔离级别有 read uncommited.read commited.repeatable read.serializable 四种,其中默认为 repeatable ...

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

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

  4. mysql 默认事务隔离级别_一文读懂MySQL的事务隔离级别及MVCC机制

    回顾前文: <一文学会MySQL的explain工具> <一文读懂MySQL的索引结构及查询优化> (同时再次强调,这几篇关于MySQL的探究都是基于5.7版本,相关总结与结论 ...

  5. SpringCloud工作笔记054---事物处理_MySQL的四种事务隔离级别_以及修改Mysql默认隔离级别

    JAVA技术交流QQ群:170933152 Mysql修改默认隔离级别: MySQL mysql默认的事务处理级别是'REPEATABLE-READ',也就是可重复读 1.查看当前会话隔离级别 sel ...

  6. MYSQL系列---默认隔离级别所引发的问题

    1.事务的隔离级别: 1 .原子性.事务是数据库的逻辑工作单位,事务中包含的各操作要么都做,要么都不做 2 .一致性.事 务执行的结果必须是使数据库从一个一致性状态变到另一个一致性状态.因此当数据库只 ...

  7. MySQL数据库引擎、数据事务与隔离级别

    MySQL数据库引擎 MySQL数据库引擎取决于MySQL在安装的时候是如何被编译的.要添加一个新的引擎,就必须重新编译MYSQL.在缺省情况下,MYSQL支持三个引擎:ISAM.MYISAM和HEA ...

  8. 列举MySQL事务的隔离级别_mysql dba系统学习(22)数据库事务详解

    上个星期去面试数据库管理员的工作,笔试通过之后就是直接的面试,他问了我一个问题,叫我介绍哈数据库的事务的看法和理解,但是不知所错的没有章法的乱答一气,唉唉,基础不扎实啊. 下面来好好的学习哈mysql ...

  9. 阿里 mysql默认的隔离级别_mysql的默认隔离级别

    1.数据库默认隔离级别:  mysql ---repeatable,oracle,sql server ---read commited 2.mysql binlog的格式三种:statement,r ...

最新文章

  1. Java程序员三年的工作经验,却不如一个新人的工资高???
  2. c++ ado 程序终止时崩溃
  3. Linux系统上的文件类型
  4. 用计算机绘制函数图象教案,信息技术应用 用计算机画函数图象教学设计(教案)...
  5. java字符型转百分比_小数转换成百分比,转字符串
  6. C#基础第七天-作业-利用面向对象的思想去实现名片-动态添加
  7. Z-Stack Home Developer's Guide—2. Overview中文翻译【Z-Stack Home 1.2.0开发文档】
  8. python代码风格
  9. 移动通信网络协议 — GTP-U 隧道协议
  10. SFP+光纤模块使用
  11. 计算机毕业设计java+ssm生鲜超市进销存管理系统(源码+系统+mysql数据库+Lw文档)
  12. C#MessageBox 自动关闭窗口
  13. 高通4G全网通骁龙410系列-MSM8916(M9+) ( Cortex-A53架构)
  14. 媒体访谈| 知道创宇邓金城: DDoS攻势愈烈,抗D服务需不断优化
  15. 以“实景+科幻三维建模渲染”,助力“实景三维中国建设”
  16. windows服务器文件上传与下载(不需要下载软件)
  17. 如何将WORD中的公式转为图片
  18. 哲理故事300篇(上)
  19. 中测康苑——企业文化
  20. 未连接到互联网错误的解决方案

热门文章

  1. 深度学习 自组织映射网络 ——python实现SOM(用于聚类)
  2. 十四、矩阵的快速转置算法
  3. 混沌模型时间序列预测
  4. C++ Primer 5th笔记(chap 12 动态内存)weak_ptr
  5. 区块链BaaS云服务(2)亚马逊 Amazon Managed Blockchain
  6. Fabric--启动网络手动
  7. PowerShell脚本遇到的问题汇总
  8. ubuntu第一次设置root密码
  9. CVE-2012-0158栈溢出漏洞分析
  10. Java线程的生命周期及线程的几种状态