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 oracle 默认事务级别_oracle 默认的事务隔离级别相关推荐

  1. Spring的AOP和IOC是什么?使用场景有哪些?Spring事务与数据库事务,传播行为,数据库隔离级别

    Spring的AOP和IOC是什么?使用场景有哪些?Spring事务与数据库事务,传播行为,数据库隔离级别 AOP:面向切面编程. 即在一个功能模块中新增其他功能,比方说你要下楼取个快递,你同事对你说 ...

  2. 以mysql为例有几种隔离级别_mysql有几种隔离级别

    mysql有4种隔离级别,分别为:1.读未提交内容:2.读取提交内容:3.可重复读:4.可串行化. Mysql的四种隔离级别 SQL标准定义了4类隔离级别,包括了一些具体规则,用来限定事务内外的哪些改 ...

  3. 一天十道Java面试题----第四天(线程池复用的原理------>spring事务的实现方式原理以及隔离级别)

    这里是参考B站上的大佬做的面试题笔记.大家也可以去看视频讲解!!! 文章目录 31.线程池复用的原理 32.spring是什么? 33.对Aop的理解 34.对IOC的理解 35.BeanFactor ...

  4. 正确理解MYSQL事务的可重复读RR隔离级别与锁

    1,mysql默认的事务隔离级别是可重复度. 可重复度就是在一个事务中对相同数据的多次查询将返回相同结果. 比如 事务1: BEGIN; SELECT age from student where i ...

  5. 腾讯面试:MySQL事务与MVCC如何实现的隔离级别?

    有情怀,有干货,微信搜索[三太子敖丙]关注这个不一样的程序员. 本文 GitHub https://github.com/JavaFamily 已收录,有一线大厂面试完整考点.资料以及我的系列文章. ...

  6. mysql 事务,锁,与四大隔离级别

    概念 事务 原子性:事务必须是一个自动工作的单元,要么全部执行,要么全部不执行. 一致性:事务结束的时候,所有的内部数据都是正确的. 隔离性:并发多个事务时,各个事务不干涉内部数据,处理的都是另外一个 ...

  7. 数据库事务的4大特性与隔离级别

    本篇讲诉数据库中事务的四大特性(ACID),并且将会详细地说明事务的隔离级别. 如果一个数据库声称支持事务的操作,那么该数据库必须要具备以下四个特性: ⑴ 原子性(Atomicity) 原子性是指事务 ...

  8. 数据库脏读、事务的四大特性、四大隔离级别、三大范式

    一.数据概念 1.脏数据所指的就是未提交的数据.也就是说,一个事务正在对一条记录做修改,在这个事务完成并提交之前,这条数据是处于待定状态的(可能提交也可能回滚),这时,第二个事务来读取这条没有提交的数 ...

  9. mysql mvcc和行锁_mysql在RR的隔离级别下,究竟是通过MVCC解决幻读的还是通过行锁的next key算法解决的?...

    首先,我们需要搞懂几个隔离级别的意思和每个隔离级别会出现的问题.隔离级别分为:读未提交,读提交,可重复读和可串行化. 读未提交是最低级别的隔离级别,表示当一个事务还没有提交时,他所做的变更就被别的事务 ...

最新文章

  1. Entity Framework的启动速度优化
  2. File `listings.sty' not found. usepackage
  3. 并查集数据结构的几种实现
  4. 【BZOJ - 2574】[Poi1999] Store-Keeper(点双连通分量,求割点,记忆化bfs)
  5. mysql放开权限控制_mysql06---权限控制-阿里云开发者社区
  6. 幼儿园管理云平台众多,只有一家与众不同
  7. 写一个SFTP工具类实现连接
  8. php5市场占有率,javascript,php_目前国内浏览器的市场占有率?,javascript,php,html,html5,css - phpStudy...
  9. java 微博发布时间_java 对新浪微博微博的发表时间解析
  10. matlab 打开立即窗口,《如何编程打开或关闭VBE界面中的立即窗口及其他窗口?》-- access911.net 文章...
  11. 乐视超级电视刷鸿蒙,乐视超3X55刷精简+root系统记录
  12. 淘宝客API订单接入的一些坑
  13. 最速下降法(梯度下降法)python实现
  14. c语言文件合并,c++实现合并文件以及拆分实例代码
  15. Tomcat 解决“At least one JAR was scanned for TLDs yet contained no TLDs”问题
  16. MVC框架简介与JavaSE实例
  17. Navicat for MySQL 11注册码
  18. css3+jquery仿win7开机效果
  19. 日本python教程视频_清华学姐推荐的python视频400集,拿走不谢
  20. 网络安全-Kali更新源(APT)

热门文章

  1. 解决element 照片墙上传时回显问题
  2. 我如何进入Docker容器的shell?
  3. 如何使用jQuery替换div的innerHTML?
  4. c# 单例 按需创建
  5. 网络编程 -- RPC实现原理 -- RPC -- 迭代版本V4 -- 远程方法调用 整合 Spring 自动注册...
  6. Python 内置函数sorted()在高级用法
  7. ZABBIX安装官方指南
  8. 修改maven中的jdk版本
  9. Win7旗舰版安装Oracle_11gR1_database
  10. eclipse 设置PythonIDE