详解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. 明明程序员很累,为什么还有这么多人想入行?
  2. 2019年美团,滴滴,蘑菇街Java大数据面经分享!
  3. PHP设置块注释的模板
  4. [精品]CSAPP Bomb Lab 解题报告(六)
  5. ajax eval html,Ajax eval的应用示例
  6. 前端学习(684):循环导读
  7. Vue 模块化开发(构建项目常用工具)
  8. Docker容器(container)详解
  9. css3中的box-shadow的用法与text-shadow的用法
  10. Tortoiser三十集脱壳教程__ZC
  11. 深度学习教程(4) | 深层神经网络(吴恩达·完整版)
  12. oeasy教您玩转vim - 28 - 水平移动
  13. 细胞穿膜肽-MnO2复合物(TAT-MnO2)多肽偶联氧化锰纳米粒|MnO2包裹聚多巴胺的纳米颗粒
  14. APP推广:app推广的渠道有哪些既简单又有效的?
  15. 树莓派价格暴涨买不起?他们自己做了一块价格还不到1/4的开发板平替树莓派,还火到海外去了
  16. Windows10息屏快的问题解决办法(在更改屏幕和睡眠时间无效的情况下)
  17. 计算机未连接到网络,电脑无法连接到网络的处理办法
  18. 专科计算机教育的现状,探析高职计算机专业英语教学现状
  19. 蓝鹰立德丨2021年个税汇算清缴之未雨绸缪(上)
  20. MATLAB/Python MK检验程序

热门文章

  1. qt 3d迷宫游戏_Switch游戏 | 吃豆旅行走走停停
  2. WordPress精仿小米社区简洁大气主题模板Misq
  3. 【第一篇】Spring Cloud简介
  4. MySQL官网下载安装包
  5. DBCP连接池TestOnBorrow的坑
  6. Java项目(三)-- SSM开发社交网站(7)--会员注册与登录
  7. 视频教程-2020全新Javascript基础面试视频前端js教程-JavaScript
  8. Android应用程序开发以及背后的设计思想深度剖析(4)
  9. 安装网卡驱动的办法,以及系统优化工具
  10. Response.Write(scriptalert('验证码不正确');/script); 丢失样式表解决方案