事务
date
Dec 19, 2021
slug
DDIA-chapter7
status
Published
tags
DDIA
summary
DDIA第七章读书笔记
type
Post
由于打比赛而停摆了的DDIA学习计划又重启了
事务(并发控制)
这一周的主题是并发控制。
我想,这大概是数据库领域中最迷人的话题之一了。(当然也是最难的内容之一)
花了几天时间陆陆续续将书上这一章的内容读完了,但是感觉到作者是想要将这些知识通俗易懂地讲给读者但是又明显力不从心,所以读起来感觉很乱。
然后又花了一天时间去看之前课上的讲义觉得讲义的内容更提纲挈领一些。这里是邹老师的数据库讲义链接。
当然书中也补充了一些讲义中没有的。
下面挑了一些我比较感兴趣的。
写倾斜
写倾斜的模式:
1. select符合条件的行(或检查是否符合相应条件,比如两个医生至少有一个在值班)
2. 应用层根据条件去判断是否继续执行
3. 执行读写操作
但是当这个事务进行完2准备进行3时,另一个事务改变了相应的行,使得该事务的1中的条件未必依然成立时,但该事务他自己并不知道依旧执行后续代码,便出现了写倾斜也就是幻读。
解决方法:
1. 谓词锁:简单的说就是不是对对象加锁,而是对某个查询条件加锁
2. 由于谓词锁匹配代价比较大,有时候可以扩大范围升级成索引区间锁
MVCC多版本并发控制
这个在讲义中有提及,为了进一步拓展从网上找到了两篇文档来理解Postgres数据库中的MVCC的具体实现
- MVCC Unmasked 这篇比较详细 但是格式上不是很易读(后面的部分还没看完)
- PostgreSQL 的 MVCC 机制解析 这篇文章通俗易懂,并且讲的是最基础的场景比较易于理解。
可串行化的快照隔离
似乎为了获得可串行化,性能就会变差,为了性能去使用弱隔离级别的话可能又会出现各种边界情况。
不过书中提到的可串行化的快照隔离算法(Serializable Snapshot Isolation,SSI)提供了完整的可串行化保证,而性能相比于快照隔离损失很小。
这两篇论文还没来得及看,后面补上。