2.隔离级别实现

上一节介绍了ANSI定义的3种异象,及根据禁止异象的个数而定义的事务隔离级别。因为不存在严格、严谨的“官方”定义,各主流

2.1 Lock-based 隔离级别实现

在展示Lock-based隔离级别实现前,先介绍几个与锁相关的概念:Item Lock:对访问行加锁,可以防止dirty/fuzzy read。

Predicate Lock(gap lock):对search的范围加锁,全表扫描直接对整张表加锁,可防止phantom read。

Short duration:语句结束后释放锁。

Long duration:事务提交或回滚后释放锁。

上述锁操作组合,便可实现不同级别的事务隔离标准,如下表所示。

其中S lock代表共享锁,X lock代表排它锁。

首先所有写操作加X locks时,都会选择Long duration,否则short duration锁被释放后,在事务提交前该条更改可能被其它事务写操作覆盖,造成脏写(dirty write)。

其次对于读操作:

Short duration Item S lock 禁止了 P1发生,读操作如果遇到正在修改的行(写事务加了X Lock),阻塞在S Lock,直到写事务提交。

Long duration Item S lock 禁止了P2发生,写操作遇到读事务(S Lock),阻塞在X Lock上直到读事务提交或回滚。

Long duration Predicate/Table S Lock 禁止了P3发生,(范围)写操作遇到范围读操作(加Predicate S Lock),会被阻塞,直到读事务提交或回滚。

基于锁实现的三种隔离级别分别能禁止的异象如下表所示:

然而当今数据库基于性能等多方面考虑,很少有完全基于锁实现隔离级别的,MVCC+Lock的方式,可以满足读请求不加锁,是主流的实现方式。

2.2 Oracle隔离级别的实现

Oracle仅支持两种隔离级别:Read Committed与Serializable。尽管官方这样描述,Oracle的Serializable实际是基于MVCC+Lock based的SI(Snapshot Isolation)隔离级别。

为实现快照读,内部维护了全局变量SCN(System Commit/Change Number),在事务提交时递增。读请求获取Snapshot便是获取当前最新的SCN。Oracle实现MVCC的方式是将block分为两类:(1)Current blocks为当前最新的页面,与持久化态数据保持一致。(2)Consistent Read blocks,根据snapshot SCN生成相应的一致性版本页面。

以下两个具体的例子展示了:不同隔离级别下,读写语句在数据库内部发生了什么。

Oracle在read committed隔离级别下,每条语句都会获取最新的snapshot,读请求全部是snapshot读。写请求在更新行之前,需要加行锁。由于写操作不会因为有其它事务更新了同一行,而停止更新(除非不满足更新的谓词条件了),因此Lost Update有可能发生。

Oracle在serializable隔离级别下,事务开始便获取snapshot。读请求全部是snapshot读,而写请求在更新行之前,需要加行锁。写操作在加锁后,首先检查该行,如果发现:最近修改过这行的事务的SCN大于本事务的SCN,说明它已经被修改且无法被本事务看到,会做报错处理,避免了Lost Update。这种写冲突的实现,显然是first committer wins。

下表展示了Oracle的两种隔离级别,分别能够避免哪些异象:

2.3

InnoDB同样以MVCC+Lock的方式实现隔离级别。其中普通select语句均是snapshot read。而delete/update/select for update等语句是加锁实现的current read,如下表所示(注:该表为Pecona 5.6版本的代码实现)。

InnoDB的RC隔离级别的表现与Oracle相似。而相较于Oracle的SI,InnoDB RR隔离级别依旧不能避免Lost Update(例如下例)。究其原因,InnoDB在RR隔离级别下,不会在事务提交时判断是否有其它事务修改过该行。这避免了了SI更新冲突带来的回滚代价,带来了可能发生Lost Update的风险。

由于update等操作均是加锁的当前读,因此Phantom Read的现象也是存在的(如下表所示)。但是如果将Txn1的update语句替换为select语句,Phantom Read现象则可以禁止,因为整个事务select语句使用的是同一个snapshot。

Innodb RR的实现方式虽然并非并未严格排除Lost Update和Repeatable Read,但其充分利用MVCC读不加锁的并发能力,同时current read避免了SI在更新冲突剧增时过多的回滚代价。

InnoDB还实现了Lock Based Serializable(详见2.1),禁止了所有异象。

mysql事务隔离级别与锁_mysql事务隔离级别与锁相关推荐

  1. mysql 事务隔离级别实现原理_MySQL事务隔离级别和实现原理 - 米扑博客

    开发中经常提到数据库的事务,那你知道数据库还有事务隔离的说法吗, 事务隔离还有隔离级别,那什么是事务隔离,隔离级别又是什么呢? MySQL 事务 本文所说的 MySQL 事务都是指在 InnoDB 引 ...

  2. mysql事务会不会上锁_MySQL事务以及加锁机制

    事务的特征ACID,即原子性.一致性.隔离性.持久性. 原子性保证一个事务为一个最小的单元,内部不可分割: 一致性保证事务中的每个操作线程不可单独提交,成功则一起提交,不成功则事务回滚: 隔离性保证不 ...

  3. mysql rr解决幻读吗_mysql rr隔离级别解决幻读了吗

    以下内容全部基于innodb. 虽然下面有很多概念很浅显,但还是要解释一下 什么是幻读? 当一个事务在多次查询中,发现了一行不是在当前事务中添加的数据.出现这种问题就叫做幻读. 关于四种隔离级别 未提 ...

  4. mysql事务能支持多大_MySQL事务调优

    数据库事务 数据库事务是数据库系统执行过程中的一个逻辑处理单元,保证一个数据库操作要么成功,要么失败. 数据库事务具有以下四个基本属性: 原子性(Atomicity) 一致性(Consistent) ...

  5. mysql事务中怎么更改空值_MySQL事务

    1.事务 1.事务特性--ACID Atomicity(原子性):要么全做,要么不做,不能只做一半(银行转账) Consistency(约束性):事务的前后,约束都能满足 Isolation(依赖性) ...

  6. mysql设置乐观锁_mysql数据库怎么设置乐观锁

    乐观锁与悲观锁不同的是,它是一种逻辑上的锁,而不需要数据库提供锁机制来支持当数据很重要, 回滚或重试一次需要很大的开销时,需要保证操作的ACID性质, 此时应该采用悲观锁而当数据对即时的一致性要求不高 ...

  7. mysql 可重复读 更新覆盖_Mysql事务隔离级别之可重复读

    Mysql事务隔离级别之.可重复读(REPEATABLE-READ) 查看mysql 事务隔离级别 mysql> SELECT @@tx_isolation; +---------------- ...

  8. mysql innodb 间隙锁_MySQL中InnoDB的间隙锁问题

    在为一个客户排除死锁问题时我遇到了一个有趣的包括InnoDB间隙锁的情形.对于一个WHERE子句不匹配任何行的非插入的写操作中,我预期事务应该不会有锁,但我错了.让我们看一下这张表及示例UPDATE. ...

  9. mysql ddl 锁_MySQL Online DDL导致全局锁表案例分析

    MySQL Online DDL导致全局锁表案例分析 我这边遇到了什么问题? 线上给某个表执行新增索引SQL, 然后整个数据CPU打到100%, 连接数暴增到极限, 最后导致所有访问数据库的应用都奔溃 ...

最新文章

  1. SQL Server 2008中Analysis Services的新特性——深入SQL Server 2008
  2. Java对二叉树的操作
  3. 2021年第二届“华数杯”全国大学生数学建模竞赛
  4. mysql group_concat
  5. 我想solo自己一个人!
  6. Java中List、Map、Set三个接口,存取元素时,各有什么特点?
  7. 数据结构(一)快速排序
  8. 苹果电脑怎样清理DNS缓存?
  9. excel文件损坏修复绝招_电脑常识:电脑提示dll文件丢失/损坏,该怎么修复?...
  10. 哈夫曼编码问题(贪心算法)
  11. 医学编码与计算机,医学编码培训课件.ppt
  12. 中华文本库c语言题答案,大学计算机基础试题题库及答案(精编).doc
  13. 到底买苹果XS还是XR_iPhone XS和iPhone XR买哪个好?苹果XR和XS区别对比测评
  14. pycharm 软件详细使用教程,新手必看篇
  15. 常用计量单位及其换算
  16. 【rzxt】笔者支招:电脑的散热大户显卡温度过高如何解决
  17. JAVA端收集Liunx服务器 CPU 内存 磁盘使用率
  18. 《天赋》:第一章 天赋
  19. 通过apk签名使应用程序有系统权限
  20. 浙江理工大学校园网DNS性能测试脚本

热门文章

  1. 应用MVP模式写出可维护的优美Android应用
  2. FPGA学习及设计中的注意事项
  3. C++ 模板中定义友元
  4. ARM裸机篇--按键中断
  5. 清华镜像:zookeeper
  6. Netty 框架学习(二):Netty粘包和拆包
  7. Maven nexus私服仓库类型说明及配置阿里云代理仓库
  8. docker,containerd,runc,docker-shim之间的关系
  9. 【網址收藏】解决VSCODE“因为在此系统上禁止运行脚本“报错
  10. golang管道channel的遍历和关闭:应该使用for...range来遍历