介绍

在关于ACID和数据库事务的文章中,我介绍了SQL标准描述的三种现象:

  • 脏读
  • 不可重复读
  • 幻读

尽管这些可以很好地区分四个隔离级别(未提交读,已提交读,可重复读和可序列化),但实际上,还有更多的现象需要考虑。 1995年的论文(《 ANSI SQL隔离级别批判》)介绍了标准规范中省略的其他现象。

在我的《高性能Java持久性》一书中,我决定坚持“事务”一章,因为它对数据访问的有效性和效率都非常重要。

领域模型

对于以下示例,我将使用以下两个实体:

在我们的虚构应用程序中,更改“ 帖子”标题后,必须将作者记录在关联的“ PostDetails”记录中。 如果未防止读写时滞,则可以破坏此域模型约束,如以下测试案例所示。

读取歪斜

以下测试模拟了读取偏斜如何发生:

doInConnection(aliceConnection -> {prepareConnection(aliceConnection);String title = selectStringColumn(aliceConnection, selectPostTitleSql());executeSync(() -> {doInConnection(bobConnection -> {prepareConnection(bobConnection);try {update(bobConnection, updatePostTitleParamSql(), new Object[]{"Bob"});update(bobConnection, updatePostDetailsAuthorParamSql(), new Object[]{"Bob"});} catch (Exception e) {LOGGER.info("Exception thrown", e);preventedByLocking.set(true);}});});String createdBy = selectStringColumn(aliceConnection, selectPostDetailsAuthorSql());
});
  • 爱丽丝选择一个帖子标题
  • Bob潜入并更新了PostPostDetails实体
  • Alice线程将继续,并且她选择PostDetails记录

如果允许读取偏斜,则Alice会看到Bob的更新,并且可以假定先前的Post版本(在交易开始时读取)是Bob发行的(可能不准确)。

在四个最常见的关系数据库系统上运行此测试可获得以下结果:

数据库隔离级别 读取歪斜
Oracle读已提交
Oracle可序列化 没有
SQL Server读未提交
SQL Server读取已提交
SQL Server读取提交的快照隔离
SQL Server可重复读取 没有
SQL Server可序列化 没有
SQL Server快照隔离 没有
PostgreSQL读未提交
PostgreSQL读已提交
PostgreSQL可重复读 没有
PostgreSQL可序列化 没有
MySQL读取未提交
MySQL读取提交
MySQL可重复读 没有
MySQL可序列化 没有

写偏斜

要模拟写偏斜,您需要执行以下测试用例:

doInConnection(aliceConnection -> {prepareConnection(aliceConnection);String title = selectStringColumn(aliceConnection, selectPostTitleSql());String createdBy = selectStringColumn(aliceConnection, selectPostDetailsAuthorSql());executeSync(() -> {doInConnection(bobConnection -> {prepareConnection(bobConnection);try {String bobTitle = selectStringColumn(bobConnection, selectPostTitleSql());String bonCreatedBy = selectStringColumn(bobConnection, selectPostDetailsAuthorSql());update(bobConnection, updatePostTitleParamSql(), new Object[]{"Bob"});} catch (Exception e) {LOGGER.info("Exception thrown", e);preventedByLocking.set(true);}});});update(aliceConnection, updatePostDetailsAuthorParamSql(), new Object[]{"Alice"});
});
  • 爱丽丝从PostDetails记录中选择Post标题和作者
  • Bob还选择了Post标题和相关的作者,但他决定仅更新标题
  • 爱丽丝想在不更改帖子标题的情况下更新PostDetails记录

如果允许写偏斜,则将执行Alice和Bob不相交的写操作,而不会受到控制这两个记录的约束的阻止。

在四个最常见的关系数据库系统上运行此测试可获得以下结果:

数据库隔离级别 写偏斜
Oracle读已提交
Oracle可序列化
SQL Server读未提交
SQL Server读取已提交
SQL Server读取提交的快照隔离
SQL Server可重复读取 没有
SQL Server可序列化 没有
SQL Server快照隔离
PostgreSQL读未提交
PostgreSQL读已提交
PostgreSQL可重复读
PostgreSQL可序列化 没有
MySQL读取未提交
MySQL读取提交
MySQL可重复读
MySQL可序列化 没有
  • 写偏斜在多版本并发控制机制中很普遍,即使声称使用“可序列化”,Oracle也无法阻止它,而实际上它只是一个快照隔离级别。
  • 当使用“可重复读”和“可序列化”时,SQL Server默认的基于锁定的隔离级别可以防止写偏斜。 快照隔离级别(基于MVCC)中的任何一个都不能阻止/检测到它。
  • PostgreSQL使用更高级的可序列化快照隔离级别来阻止它
  • MySQL在使用Serializable时会使用共享锁,因此即使InnoDB也是基于MVCC的,也可以防止写偏斜

如果您对此主题感兴趣,那么您也可以阅读我正在编写的《 高性能Java持久性》一书。

翻译自: https://www.javacodegeeks.com/2015/10/a-beginners-guide-to-read-and-write-skew-phenomena.html

读写偏斜现象的初学者指南相关推荐

  1. python编程入门指南上下百度云-Python编程初学者指南 PDF扫描版[87MB]

    Python编程初学者指南 内容简介: 如果你刚刚接触Python编程,而且正在寻找一本实用的教程,那么这本书为你量身打造.通过阅读本书,你不仅会学到很多实用的Python编程知识,还将懂得如何在实际 ...

  2. python编程入门指南-Python编程初学者指南 PDF扫描版[87MB]

    Python编程初学者指南 内容简介: 如果你刚刚接触Python编程,而且正在寻找一本实用的教程,那么这本书为你量身打造.通过阅读本书,你不仅会学到很多实用的Python编程知识,还将懂得如何在实际 ...

  3. selenium初学者指南_如何进化人工智能生活:初学者指南

    selenium初学者指南 'Evolving artificial intelligent life' might sound like a grandiose claim from an indi ...

  4. Unity增强现实初学者指南视频教程 A Beginner’s Guide to Augmented Reality with Unity

    Unity增强现实初学者指南视频教程 A Beginner's Guide to Augmented Reality with Unity MP4 |视频:h264,1280×720 (部分1920X ...

  5. 《C语言编程初学者指南》一2.9 理解运算符优先级

    本节书摘来自异步社区<C语言编程初学者指南>一书中的第2章,第2.9节,作者[美]Keith Davenport(达文波特) , M1ichael Vine(维恩),更多章节内容可以访问云 ...

  6. 《C语言编程初学者指南》一1.5 使用程序语句

    本节书摘来自异步社区<C语言编程初学者指南>一书中的第1章,第1.5节,作者[美]Keith Davenport(达文波特) , M1ichael Vine(维恩),更多章节内容可以访问云 ...

  7. 《Python编程初学者指南》——1.6 回到Game Over程序

    本节书摘来自异步社区<Python编程初学者指南>一书中的第1章,第1.6节,作者[美]Michael Dawson,王金兰 译,更多章节内容可以访问云栖社区"异步社区" ...

  8. python编程电子书下载-python编程初学者指南

    python编程初学者指南全书共12章,内容浅显易懂,书中的每一个章节都会用一个完整的游戏来演示其中的关键知识点,最后都会对该章的知识点进行小结,还会给出一些小练习让你试试身手.东坡小编为大家分享py ...

  9. python编程入门指南pdf-python编程初学者指南

    python编程初学者指南是一本边学边制作游戏的经典教程,由美国程序员道森(Michael Dawson)编著.通过阅读本书,你不仅会学到很多实用的Python编程知识,还将懂得如何在实际工作中运用这 ...

最新文章

  1. C++ with STL(五)queuestacklist
  2. android 减少图片出现oom错误
  3. 高级数据结构与算法 | AVL树 (高度平衡树)
  4. no result type defined for type 'dispatch'mapped
  5. SDUT 3258 Square Number 简单数学
  6. 波及1.95亿辆车,黑莓承认系统存在漏洞,大众、宝马纷纷“躺枪”
  7. 「镁客·请讲」HelloEOS梓岑:嘻哈外表下的区块链式达尔文主义
  8. 【dubbo异常处理】Fail to decode request due to: RpcInvocation
  9. 模拟模型学习----几何布朗运动模拟 与 基于扩散模拟
  10. [Graphics]自组织植物建模方法(ContinousLassoBrush)
  11. java BigDecimal比较大小
  12. W ndows7蓝屏0x00000024,Win7蓝屏代码0x00000024修复方法
  13. word中使用宏批量插入图片
  14. 选择云服务器主要看那方面的参数和性能
  15. 金融相关时间序列分析全指南
  16. JS变量的定义和数据类型
  17. python爬取《龙岭迷窟》的数据,看看质量剧情还原度到底怎么样
  18. UE4之简单的多人游戏
  19. OC---oc基础入门
  20. Mysql数据库地区表 递归查询 省市区

热门文章

  1. 利用随机森林对特征重要性进行评估 方法一
  2. mysql 多个主码_数据库中几个基本概念 主码 外码
  3. 以后我给你们上课的机会可能越来越少了
  4. MATLAB怎么让三围图动起来,Matlab小技巧 -- 让图动起来!
  5. 设计模式之责任链模式
  6. SAP 账号被锁定,显示无法再进行口令登录的解决办法
  7. 让mysql支持emoji表情_让MySQL支持Emoji表情 mysql 5.6
  8. 概率分布详解 Bernoulli、Binomial、Beta
  9. 基于身份的常数级环签名
  10. Linux只读文件系统