码迷,mamicode.com
首页 > 其他好文 > 详细

红书推荐系列(六): Granularity of Locks and Degrees of Consistency in a Shared Data Base

时间:2020-11-17 12:46:44      阅读:8      评论:0      收藏:0      [点我收藏+]

标签:isp   常见   不同的   nsa   pap   ble   文章   数据库   有向无环图   

  看了前几篇随笔,感觉有点翻译的味道,以后我尽量避免。

  这次我们要看的是关于数据库的并行控制的paper,是1976年的老文章了。这篇paper分为两个部分,第一部分介绍多粒度锁,讲的是在继承结构下的加锁方法,第二部分介绍关于多层级的isolation。

多粒度锁

  直觉上,排外锁(X)和共享锁(S)对于一个继承结构的数据系统(熟悉结构)是必须的。然而,这两种锁还不足以解决问题,比如有如下的结构。

技术图片

  假设我们已经给D加了J锁,此时我们想要给D加X锁可以直接加锁,显然是有问题的,这需要我们在加锁前先查看所有的祖先结点和子孙结点是否被加锁,这显然不合理。为此需要一种新的锁--意图锁(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

  比如说,count_x的值是var中值等于x的数量,如果所有的count_x都满足这个要求,那么这个数据库就是consistent。

  由多个原子操作组成的transaction执行过程中,不可避免的会产生暂时不一致性,借此将一致性分为四个等级。

  Transaction T有四个要求(不一定全部符合):

  1. T不会覆写其它事务未提交的数据。
  2. T在最终提交之前不会提交任何写操作。
  3. T不会读其它事务未提交的数据。
  4. 在T结束前,其它事务不会覆写T读的数据。

 

  满足1、2、3、4条件的一致性度为3,满足1、2、3条件的一致性度为2,满足1、2条件的一致性度为1,只满足1条件的一致性度为0。

一致性的锁协议

  为了提供的不同一致性特性,就需要提供不同等级的锁协议。锁的分类有多种标准,除了上面的章节提到过了排它锁和共享锁,根据锁的存在时长,还分为短期锁(只锁住单一的操作)和长期锁(锁住整个事务)。

  对于不同等级的一致性,对应的锁协议如下:

  • 程度3:事务T对1)写的数据设置长期排它锁,2)读的数据设置长期共享锁。
  • 程度2:事务T对1)写的数据设置长期排它锁,2)读的数据设置(可能短期)共享锁。
  • 程度1:事务T对1)写的数据设置长期排它锁。
  • 程度0:事务T对1)写的数据设置(可能短期)排它锁。

事务计划

  一致性的需求来自多个事务通常有多个操作,每个事务操作同时运行时,需要避免事务间脏读。多个事务的执行顺序决定了最终所有事务运行的并行度。最简单有效的方法是一个事务所有的操作执行完,再执行另一个事务的所有事务(也就是所谓的serial)。

  具体一个事务的并行度确定是个比较复杂的问题,读者现在可以停一下,尝试自己提出一个确定多个事务并行度的方法。

  

 

 

 

 

 

 

 

 

 

 

  OK,接下来我们阐述并行度确定的算法。如果一个事务T需要的数据来自另一个事务T′的输出,那么T对T′存在依赖。依赖分为三种:<,<<,<<<,我们令a和a′为T的某个操作,意义如下:

  • T<<<T′:如果  a是一个写操作,a′是一个写操作

                         或者   a是一个写操作,a′是一个读操作

                         或者   a是一个读操作,a′是一个写操作

  • T<<T′:  如果   a是一个写操作,a′是一个写操作

                         或者   a是一个写操作,a′是一个读操作

  • T<T′:    如果   a是一个写操作,a′是一个写操作

  这三种分别对应并行度3、并行度2、并行度1。根据两个事务间的依赖关系来决定事务的并行度。一般来说,如果多个事务可以serial,那么就可以根据其依赖关系确定每个事务的并行度。

 

红书推荐系列(六): Granularity of Locks and Degrees of Consistency in a Shared Data Base

标签:isp   常见   不同的   nsa   pap   ble   文章   数据库   有向无环图   

原文地址:https://www.cnblogs.com/arch/p/13940850.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!