美文网首页
分布式事务 --乐观并发控制

分布式事务 --乐观并发控制

作者: wayyyy | 来源:发表于2022-10-04 00:57 被阅读0次

    两阶段锁限制了系统性能,于是有人想到不用锁实现,即乐观并发控制,乐观并发控制认为:大部分的时候,事务冲突的可能性比较小,事务顺利完成的可能性比失败的可能性要大。因此,乐观并发控制将重点放在事务提交冲突检查上,而不是直接锁住数据不让访问。

    乐观并发控制算法有两类:

    • 基于检查的并发控制
    • 基于时间戳的并发控制
    基于检查的并发控制

    基于检查的并发控制,为每个事务涉及的数据创建一个私有副本,所有的更新操作都在私有副本上执行,再通过原来的数据是否有冲突来决定是否能够提交事务。具体流程包含3个阶段:

    • 读取阶段
      该阶段将事务涉及的数据复制一份副本,放到一个私有的工作空间,之后执行读操作读取私有副本中的数据,写操作将被记录到私有工作空间的临时文件中,此时事务尚未提交,其他事务无法访问此私有空间中的任何数据。

    • 校验阶段
      当事务准备提交时进入校验阶段,首先检查在此期间事务是否与其他事务产生冲突,如果没有产生冲突,则事务顺利提交;如果产生了冲突,则中止事务。例如:如果事务A修改了数据并提交,但事务B在事务A提交之前又修改了该数据,那么不允许事务A提交。

    • 写入阶段
      也有称为提交阶段,如果校验阶段成功提交事务,那么该阶段将会把私有工作空间中的数据永久地写到数据库或存储中持久化存储,完成整个事务。

    基于时间戳的并发控制

    基于时间戳的并发控制,通过为每一个事务和每个数据项分配时间戳来实现算法。

    首先为每个事务都分配一个开始时间戳,例如事务T1的开始时间戳记为TS1,当事务读写某个数据项时,系统会记录最近读取或写入该数据事务的开始时间戳,即每个数据项会记录两个时间戳:

    • 写时间戳:可以用W-Timestamp 或 W-TS(X)表示,代表数据项X最近一次被写入的时间戳
    • 读时间戳:可以用R-Timestamp 或 R-TS(X)表示,代表数据项X最近一次被写入的时间戳

    在事务提交的时候同样会进行校验,检查事务中的每个操作是否读取或写入了未来的数据,具体来说,分为下列几个步骤:

    • 对于读操作:

      • 如果事务的开始时间戳发生在数据项的写时间戳之前,即,意味着事务的读操作读到了未来的数据项,则中止事务。否则说明事务的读操作读到事务开始之前的数据项,符合要求。
      • 事务读取到数据后,系统更新数据项的读时间戳,同时保存一份X的数据项副本,保证事务在结束之前总能读到相同的X值。
    • 对于写操作:

      • 如果事务的开始时间戳在数据项的读时间戳或写时间戳之前,说明事务修改了已经被未来某个事务读取或写入的数据项,则中止事务。否则说明事务正在修海过去的数据项,符合要要求。
      • 事务写入数据后,系统更新数据项的写时间戳,同时保存一份X的数据项副本,保证事务在结束之前总能读到相同的X值。

    基于时间戳的并发控制可以解决常见的并发冲突,事务之间不必相互等待,且不会造成死锁,在单个事务读写数据不多且事务之间涉及的数据基本没有交集的情况下,可以节省大量的额外成本,提升系统的并发性能。

    基于时间戳的并发控制在实现上的一大难点是如何保证精准的时间源,因为该算法强依赖于时间戳,如果时间戳不够精准,则可能导致事务的提交顺序不正群。而分布式系统想要实现一个全局的,精准的时间戳非常困难,这又增加了可分布式系统中实现基于时间戳的并发控制难度。


    参考资料
    1、《深入理解分布式系统》

    相关文章

      网友评论

          本文标题:分布式事务 --乐观并发控制

          本文链接:https://www.haomeiwen.com/subject/vbzjartx.html