红书推荐系列(六): Granularity of Locks and Degrees of Consistency in a Shared Data Base
前
这次我们要看的是关于数据库的并行控制经典之作,虽然是1976年的老文章,但其中的概念在今天仍然流行。Paper分为两个部分,第一部分介绍多粒度锁,讲的是在继承结构下的加锁方法,第二部分介绍关于多层级的isolation。
多粒度加锁
等级结构的系统(比如文件系统)下加锁时,给较大粒度的结点(如根目录)加锁会降低事务并发度,给较小粒度的结点(如某个文件)加锁会导致系统过于复杂。作者提出了多粒度加锁机制来处理不同情况下的加锁问题。
锁一般有两种:共享锁(S)和排它锁(X)。当一个结点被一个事务加了排它锁,那么这个结点(及其子结点)就不能被其它事务访问。当一个结点被一个事务加了共享锁,那么这个结点(及其子结点)只能被其它想共享访问这个结点的事务访问。但这两种锁还不足以解决问题,比如有如下的结构。

假设一个事务已经给J加了S锁,此时另一个事务想要给D加X锁就可以直接加锁,但这显然是有问题的,给D结点加X锁也意味着J结点也应该时排它的。为此需要一种新的锁--意图锁(I),加在共享锁或排外锁的所有祖先结点上,意图锁包含一个tag,暗示子结点加的锁的类型。比如在J结点加共享锁前,需要依次给A、D结点加一个共享意图锁(IS),表示这个结点有子孙结点被加了共享锁,同样,如果一个结点加了排外锁,那么就要所有的祖先结点加一个排外意图锁(IX)。
以上的锁已经可以完成所有的情况要求,但是为性能考虑,还引入了一种锁--共享排他意图锁(SIX),即子孙结点既有S锁也有X锁的情况。
锁的兼容关系
锁的兼容关系如下表所示:
| NL | IS | IX | S | SIX | X | |
| NL | YES | YES | YES | YES | YES | YES |
| IS | YES | YES | YES | YES | YES | NO |
| IX | YES | YES | YES | NO | NO | NO |
| S | YES | YES | NO | YES | NO | NO |
| SIX | YES | YES | NO | NO | NO | NO |
| X | YES | NO | NO | NO | NO | NO |
其中,NL为non-lock。
加锁步骤
我们先介绍一个静态的继承结构的加锁过程,然后再介绍动态继承结构的加锁过程。
静态结构加锁
不管是树形结构,还是有向无环图(DAG),对一个结点加锁的步骤是相似的。S锁的祖先要加IS锁,X锁的祖先要加IX锁,释放锁的时候需要从末端到顶端释放锁。
动态结构加锁
加锁的结构经常会有删除和插入操作,所以需要提供一种解决的机制。
简单的说,需要修改的旧结点和需要增加的新结点都要加X锁。对于数据库来说,这种情况最常见于带有索引的表的操作。
比如有一个银行账户的表,以用户所在地建立索引。如果我们想修改某个用户的账号余额,因为账号余额没有索引,所以可以直接修改(通过给自己加X锁和给祖先结点加IX锁)。如果要更改银行账户的地址,我们需要在索引和记录之间加一层索引块结构(一个索引块内的所有索引值相同),那么就要同时锁住被修改的地址的索引块和修改后的地址索引块,再进行修改。
其它问题
加锁还涉及到其它的问题:调度、锁转换、死锁等,这里我就不赘述了。
DEGREES OF CONSISTENCY
Consistency在不同的情境中有不同的定义,比如分布式系统和关系型数据库的consistent概念就不同。我们先明确在数据库中的定义:数据库内数据相互依赖的关系如果都成立,那么这个数据库就是consistent。
比如说,count_x的值是var中值等于x的数量,如果所有的count_x都满足这个要求,那么这个数据库就是consistent。
由多个原子操作组成的transaction执行过程中,不可避免的会产生暂时不一致性,借此将一致性分为四个等级。
作者为事务的隔离规定了四个等级,并且用了三种不同的定义人(╬▔皿▔)╯。三种定义分别从用户的角度、锁协议以及系统运行的角度分别阐述了事务隔离等级。
系统对用户接口定义
- T不会覆写其它事务未提交的数据。
- T在最终提交之前不会提交任何写操作。
- T不会读其它事务未提交的数据。
- 在T结束前,其它事务不会覆写T读的数据。
满足1、2、3、4条件的一致性度为3,满足1、2、3条件的一致性度为2,满足1、2条件的一致性度为1,只满足1条件的一致性度为0。
锁协议定义
锁协议是我觉得比较好的定义,从读和写的角度描述事务的独立等级。四种等级如下:
- 等级0:给脏写的数据加排它锁。
- 等级1:给脏写的数据加长期排它锁。
- 等级2:给脏写的数据加长期排它锁,给读数据加共享锁。
- 等级3:给脏写的数据加长期排它锁,给读数据加长期共享锁。
一致性计划定义
多个事务同时执行时,系统会把这些事务融合成一个可并发的执行计划。具体的定义有点没看懂a(;´д`)ゞ
其它
本篇paper还考虑了事务间依赖、系统恢复等,这些内容没有那么经典,就不再介绍了。
总之,这篇paper比较早的介绍了事务独立相关的内容,对于数据库早期发展做了重要的贡献。

浙公网安备 33010602011771号