ITPub博客

首页 > 数据库 > 数据库开发技术 > 并发访问控制(5)--MVCC算法4

并发访问控制(5)--MVCC算法4

原创 数据库开发技术 作者:那海蓝蓝 时间:2024-04-09 07:08:00 0 删除 编辑

注释:如下所提及的文献,请按照索引号对应参考《分布式数据库原理、架构与实践》一书的引用参考。

可串行化的快照隔离(Serializable Snapshot Isolation即,SSI)算法实现

每个事务对象上有两个boolean型的变量——T.inConflict和T.outConflict。其中,若只有T.inConflict的值为TRUE,则表示有一个rw-dependency从别的并发事务指向自己;若只有T.outConflict的值为TRUE,则表示有一个rw-dependency从自己指向别的并发事务;若是T.inConflict和T.outConflict的值都为TRUE,则意味着有相邻的两个rw-dependency,这可能的就是一个不可串行化的快照隔离。

可串行化的快照隔离引入一个新的锁模式——SIREAD锁。

多版本的快照隔离本质不是基于锁的并发控制技术,所以其不应该和锁扯上关系。MVCC技术通常配合其他并发控制技术,以提高并发度。因多数数据库管理系统在编码实现的时候是基于SS2PL技术的,所以SSI技术基于两阶段封锁协议提出了“SIREAD”锁。换句话说:SSI=SS2PL+MVCC+SI+SIREAD锁。

SIREAD锁表示一个SI事务(使用快照隔离技术的事务)在数据项上读取了一个版本。“SIREAD”锁不会阻塞任何锁(与任何锁都相容),所以“SIREAD”锁看起来更象是一个标志而不是“锁”。“SIREAD”锁是加在数据项对象上的,不是施加在某个版本上

如果一个数据项的某个版本上存在SIREAD锁和WRITE锁,表示存在rw-dependency关系,因此持有这些锁的某个事务可以设置其inConflict和outConflict值。这样就把锁和SSI技术关联起来。

SSI算法主要体现在事务开始、读操作、写操作、事务提交折四种操作中。这四种操作的具体算法如下:

(1)在事务T开始的时候:

modified begin(T):existing SI code for begin(T)  //设置事务T的inConflict和outConflict的初始值为FALSEset T.inConflict =T.outConflict = false

(2)当事务T发生读操作时:


modified read(T, x):get lock(key=x, owner=T, mode=SIREAD) //在数据项x上施加SIREAD锁,并设定属主为当前事务if there is a WRITE lock(wl) on x //检查数据项x,当有写锁存在时,则事务T有rw-dependency指向写锁的属主事务:所以设置其inConflict值为TRUE,设置设置事务T的outConflict值为TRUE    set wl.owner.inConflict = true    set T.outConflict = true    existing SI code for read(T, x) //SI的算法实现,即SSI依旧要使用SI的算法for each version (xNew) of x //检查数据项x上的每一个新版本xNew[1]that is newer than what T read:    if xNew.creator is committed//如果xNew的创建者已经提交        and xNew.creator.outConflict: //且其outConflict值为TRUE        abort(T) //意味着有两个相邻的rw-dependency存在,所以需要回滚本事务T        return UNSAFE_ERROR    //否则,这是一个rw-dependency关系,此关系是事务T指向数据项x的新版本的创建者事务的        set xNew.creator.inConflict = true //可以正常地为xNew的创建者事务设置inConflict值为TRUE        set T.outConflict = true //为本事务T的outConflict设置值为TRUE

说明:读操作发生时,“意味着有两个相邻的rw-dependency存在”,这表明事务T处于相邻的存在rw-dependency关系的事务的尾端,即另外的一个事务->xNew.creator->T。

(3)当事务T发生写操作时:


modified write(T, x, xNew):get lock(key=x, locker=T, mode=WRITE) //在数据项x上施加WRITE锁,并设定属主为当前事务if there is a SIREAD lock(rl) on x //检查数据项x,当有SIREAD锁存在时    with rl.owner is running //且施加SIREAD锁的事务rl.owner还在运行(没有提交或回滚)        or commit(rl.owner) > begin(T)://或者rl.owner的提交时间晚于事务T的开始时间    if rl.owner is committed//意味着有两个相邻的rw-dependency存在        and rl.owner.inConflict:        abort(T) //所以需要回滚本事务T        return UNSAFE_ERROR    //否则,这是一个rw-dependency关系,由创建SIREAD锁的事务指向本事务T        set rl.owner.outConflict = true        set T.inConflict = trueexisting SI code for write(T, x, xNew) //SI算法实现,即SSI依旧要使用SI的算法# do not get WRITE lock again

说明:读操作发生时,“意味着有两个相邻的rw-dependency存在”,是表明事务T处于相邻的存在rw-dependency关系的事务的头端。即:T->rl.owner->另外的一个事务。

(4)当事务T提交时:


modified commit(T):if T.inConflict and T.outConflict: //意味着事务T处于两个相邻的rw-dependency的中间    abort(T) //存在两个相邻的rw-dependency,所以要回滚    return UNSAFE_ERROR
existing SI code for commit(T)//SI算法实现,即SSI依旧要使用SI的算法# release WRITE locks held by T# but do not release SIREAD locks //SIREAD锁不被释放

说明:SIREAD锁不被释放,因为提交后的事务也会影响其他正在运行的事务,如图4-11所示的情况,这里不再多述。

[1]事务T不应该读到(在事务T开始时没有完成提交的事务)但在事务T结束前已经提交的事务才会生成新的T读不到的版本。


扫码加关注,知数行云,专业有深度


声明:本文禁止用于开发“任何软件程序,包括但不限于训练机器学习或人工智能(AI)系统”。


原文作者:那海蓝蓝知数行云;如有侵权,请联系管理员删除。

请登录后发表评论 登录
全部评论

注册时间:2023-09-02

  • 博文量
    52
  • 访问量
    31015