读写偏斜现象的初学者指南
介绍
在关于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潜入并更新了Post和PostDetails实体
- 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
读写偏斜现象的初学者指南相关推荐
- python编程入门指南上下百度云-Python编程初学者指南 PDF扫描版[87MB]
Python编程初学者指南 内容简介: 如果你刚刚接触Python编程,而且正在寻找一本实用的教程,那么这本书为你量身打造.通过阅读本书,你不仅会学到很多实用的Python编程知识,还将懂得如何在实际 ...
- python编程入门指南-Python编程初学者指南 PDF扫描版[87MB]
Python编程初学者指南 内容简介: 如果你刚刚接触Python编程,而且正在寻找一本实用的教程,那么这本书为你量身打造.通过阅读本书,你不仅会学到很多实用的Python编程知识,还将懂得如何在实际 ...
- selenium初学者指南_如何进化人工智能生活:初学者指南
selenium初学者指南 'Evolving artificial intelligent life' might sound like a grandiose claim from an indi ...
- 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 ...
- 《C语言编程初学者指南》一2.9 理解运算符优先级
本节书摘来自异步社区<C语言编程初学者指南>一书中的第2章,第2.9节,作者[美]Keith Davenport(达文波特) , M1ichael Vine(维恩),更多章节内容可以访问云 ...
- 《C语言编程初学者指南》一1.5 使用程序语句
本节书摘来自异步社区<C语言编程初学者指南>一书中的第1章,第1.5节,作者[美]Keith Davenport(达文波特) , M1ichael Vine(维恩),更多章节内容可以访问云 ...
- 《Python编程初学者指南》——1.6 回到Game Over程序
本节书摘来自异步社区<Python编程初学者指南>一书中的第1章,第1.6节,作者[美]Michael Dawson,王金兰 译,更多章节内容可以访问云栖社区"异步社区" ...
- python编程电子书下载-python编程初学者指南
python编程初学者指南全书共12章,内容浅显易懂,书中的每一个章节都会用一个完整的游戏来演示其中的关键知识点,最后都会对该章的知识点进行小结,还会给出一些小练习让你试试身手.东坡小编为大家分享py ...
- python编程入门指南pdf-python编程初学者指南
python编程初学者指南是一本边学边制作游戏的经典教程,由美国程序员道森(Michael Dawson)编著.通过阅读本书,你不仅会学到很多实用的Python编程知识,还将懂得如何在实际工作中运用这 ...
最新文章
- C++ with STL(五)queuestacklist
- android 减少图片出现oom错误
- 高级数据结构与算法 | AVL树 (高度平衡树)
- no result type defined for type 'dispatch'mapped
- SDUT 3258 Square Number 简单数学
- 波及1.95亿辆车,黑莓承认系统存在漏洞,大众、宝马纷纷“躺枪”
- 「镁客·请讲」HelloEOS梓岑:嘻哈外表下的区块链式达尔文主义
- 【dubbo异常处理】Fail to decode request due to: RpcInvocation
- 模拟模型学习----几何布朗运动模拟 与 基于扩散模拟
- [Graphics]自组织植物建模方法(ContinousLassoBrush)
- java BigDecimal比较大小
- W ndows7蓝屏0x00000024,Win7蓝屏代码0x00000024修复方法
- word中使用宏批量插入图片
- 选择云服务器主要看那方面的参数和性能
- 金融相关时间序列分析全指南
- JS变量的定义和数据类型
- python爬取《龙岭迷窟》的数据,看看质量剧情还原度到底怎么样
- UE4之简单的多人游戏
- OC---oc基础入门
- Mysql数据库地区表 递归查询 省市区