详解SQL标准中的隔离级别定义

SQL标准中隔离级别的初衷

SQL标准,已被ANSIISO/IEC采用,定义了四种事务隔离级别。这些隔离级别在事务处理吞吐量上游不同程度的影响。
这些隔离级别根据并发执行事务时必须防止的现象定义。换言之,隔离级别定义的基础是可防止的现象(或者叫数据异常)。

数据异常/可防止的现象

早期的SQL标准只定义了如下三种常见数据异常:

  • 脏读(Dirty Reads)
    事务读取到另一个事务写入但至今未提交的数据。
  • 不可重复读(Nonrepeatable (fuzzy) reads)
    事务再次读取之前读过的数据,发现另一已提交事务修改或删除了这些数据(的部分或全部),对象是已有行
  • 幻读(Phantom reads)
    事务重新运行返回满足指定查询条件的结果集时,查到了其他已提交事务插入了满足查询条件的额外行,对象是原来不存在的新行

现今,随着数据库相关领域和应用程序的不断发展,NoSQL、NewSQL、分布式数据库的兴起,出现了很多新的数据异常,如丢失更新、写偏斜(Write Skew)、读偏斜、游标丢失更新等单机数据异常,和串行并发现象、交叉现象等分布式数据库异常,此处不加赘述,如有兴趣,请持续关注,后续会单独写文章讲解

解析

由上可见,SQL标准说的很清晰明确,修改(Update、Modify)、删除(Delete)针对的对象是已有行,是在该事务执行前表中已存在的行,重点强调已存在
而插入(Insert)针对的对象是额外的行,是在事务执行前表中不存在的行,事务执行过程中或执行完成后新增的行,重点强调新增

隔离级别的定义

SQL标准根据运行在特定隔离级别的事务被允许经历的现象定义了四个隔离级别。下表显示了这些级别。

隔离级别 脏读 不可重复读 幻读
读未提交 可能 可能 可能
读(已)提交 不可能 可能 可能
可重复读 不可能 不可能 可能
序列化(读) 不可能 不可能 不可能

Oracle支持的隔离级别

Oracle数据库支持读提交(默认)和序列化隔离级别。同时,Oracle还提供只读模式。

MySQL支持的隔离级别

MySQL数据库InnoDB存储引擎支持SQL:1992标准中的所有的四种隔离级别。InnoDB默认的隔离级别是可重复读(RR)。

**MVCC(Multiversion Concurrency Control)
多版本并发控制,目的是为了解决并发事务间的读写互斥,使用基于时间点的数据库快照技术和撤销日志(Undo Log)创建数据记录的多个版本来实现一致性非锁定读,而不是使用锁技术降低并发度和性能。
临键锁(Next-Key Lock)
索引记录锁Index Record Lock)和该索引记录前的间隙锁Gap Lock)的合集,InnoDB在搜索和索引扫描时使用它来防止幻读行。

InnoDB的“可重复读”隔离级别相较于普通的“可重复读”比较特殊,额外增加了临键锁机制解决了锁定读下的幻读行的问题。但这只是间隙锁参数开关的影响,而非隔离级别上的功能。
在一致性非锁定读场景下,其“可重复读”隔离级别下MVCC的具体表现也与“读提交”不同,它执行一致性非锁定读读取到的快照是第一次执行该一致性读时的快照,即事务内的同一查询每次执行时读的是同一快照。而在“读提交”隔离级别下每次查询执行的是当前读,每次读取获取当前时间点数据库的最新快照,可能包含其他事务已提交的修改、删除。
简言之,“可重复读”隔离级别需要解决的是“不可重复读”问题,并不需要解决“幻读”问题,InnoDB可只通过MVCC解决一致性非锁定读下的不可重复读和幻读问题,需要(默认)启用间隙锁参数以实现临键锁机制来防止锁定读下“幻读”现象的发生。如果禁用该参数,仍然是“可重复读”隔离级别,只是会出现幻读。

【数据库基本原理】详解SQL标准中的隔离级别定义相关推荐

  1. 详解SQL Server中创建数据仓库已分区表

    在本练习中,您将创建一个分区数据仓库事实数据表.非常大的表经常需要跨几个磁盘卷存储数据.ServerSecurity/Database/'>SQL Server 表无法放置在特定文件中.但是,文 ...

  2. 详解蓝牙标准中的GFSK调制

    ** 简介 ** GFSK是一种简单但应用广泛的调制方式,在蓝牙和802.11等无线通信标准中都有应用.802.11跳频FHSS时所用的调制方式是GFSK 2和GFSK 4,采用BT=0.5的高斯滤波 ...

  3. 「数据库架构」三分钟搞懂事务隔离级别和脏读

    重要要点 仅凭ACID或非ACID来思考,还需要知道数据库支持的隔离级别. 标榜为"最终一致"的某些数据库可能返回与任何时间点不一致的结果. 一些数据库提供的隔离级别比您要求的更高 ...

  4. mysql 隔离级别 快照_「数据库架构」三分钟搞懂事务隔离级别和脏读

    重要要点 仅凭ACID或非ACID来思考,还需要知道数据库支持的隔离级别. 标榜为"最终一致"的某些数据库可能返回与任何时间点不一致的结果. 一些数据库提供的隔离级别比您要求的更高 ...

  5. silverlight mysql_Silverlight中衔接MySQL数据库实例详解

    Silverlight中衔接MySQL数据库实例详解 日期:2010年5月25日 作者: 本文将重点讲述Silverlight中衔接MySQL数据库实例,这在RIA开发中比拟根底,但是也是比拟首要的内 ...

  6. 如何查看mysql数据库的引擎/MySQL数据库引擎详解

    一般情况下,mysql会默认提供多种存储引擎,你可以通过下面的查看: 看你的mysql现在已提供什么存储引擎: mysql> show engines; 看你的mysql当前默认的存储引擎: m ...

  7. HSQLDB数据库使用详解(入门)及快速使用

    hsql数据库使用详解(入门)及快速使用 一.简介: hsql数据库是一款纯Java编写的免费数据库,许可是BSD-style的协议,如果你是使用Java编程的话,不凡考虑一下使用它,相对其 他数据库 ...

  8. 基于sqlite的android数据库编程,Android编程之SQLite数据库操作方法详解

    Android编程之SQLite数据库操作方法详解 发布时间:2020-09-07 12:33:04 来源:脚本之家 阅读:85 作者:低调小一 本文实例讲述了Android SQLite数据库操作方 ...

  9. 数据库 explain详解

    数据库 explain详解 文章目录 数据库 explain详解 1.什么是explain 2.explain有什么用 3.explain个字段详解 3.1 id详解 3.2 select_type ...

最新文章

  1. 项目管理5大过程组,42个过程一句话讲解
  2. OpenCV入门要掌握的基本函数
  3. p2p网络测试工具_自媒体 IPFS官方升级DHT方案,提升网络整体性能
  4. CODEVS 1408 最长公共子序列
  5. java多线程w3c_多线程
  6. ubuntu下安装zabbix
  7. java.util (Collection接口和Map接口)
  8. makefile高级应用
  9. Word没有到一行自动换行如何解决
  10. 视频一键识别生成字幕
  11. int 、long 和long long 区别
  12. [模拟] aw3758. 距离零点的时刻(模拟+aw周赛007_1)
  13. Python可配置爬虫_自定义IP+数据库+日志+分类+分页(代理IP破解反爬虫)
  14. Win10系统下安装CAD2006与CASS
  15. c语言汇编混合编译不了,IAR汇编与C语言混合编程的问题(内附源程序)
  16. 2018年 新年目标
  17. 为什么易语言程序被360和windows安全中心认作是病毒?
  18. RuntimeError: stack expects each tensor to be equal size, but got xxx at entry 0 at entry 1
  19. 7-50 近似求PI (15分)
  20. 大数据的架构设计与未来

热门文章

  1. SQL语句大全[300个关键字]
  2. Jmeter压力测试和性能调优
  3. ES服务器搭建以及常遇问题处理
  4. node 环境 启用 ES2015导入功能
  5. sqlplus批量导入sql文件
  6. 一知名公司裁员,网友爆料称裁 80%…
  7. ArcGIS有什么板块,应用于什么方面
  8. 计算机毕业设计django基于python药房药品管理系统
  9. 浙江理工大学c语言作业网站,浙江理工大学c语言期末考试模拟试卷6
  10. 阿里云大学云学院年终特惠活动