事务:用户的每个命令操作作为一个整体,不会因为失败而被分割,也不会被其他活动看到中间状态。事务处理系统要求程序员对这些读、写操作标明起始和结束,这样才能知道事务的起始和结束。事务处理系统保证在事务的开始和结束之间的行为是可预期的。
分布式事务的考量出现在这样的场景下:数据被分片存储到许多不同的服务器上。一个操作可能要求从多个服务器上修改或者读取数据,分布式系统要尝试向用户隐藏将数据分割在多个服务器上带来的复杂度。
数据库对于正确性有一个概念称为ACID:
事务可能会在执行过程中Abort(例如除0错误、访问一个不存在的记录、死锁等),此时事务可能已经修改了数据库中的部分记录,我们需要能够回退这些事务,撤回已进行的修改。
分布式事务由两部分组成:并发控制(concurrency control)和原子提交(atomic commit)。
在并发控制中,主要有两种策略:悲观并发控制和乐观并发控制。使用哪种策略取决于环境中冲突发生的频率。
悲观并发控制:数据库使用锁来保护数据,事务在使用任何锁之前,需要获得数据的锁,如果一些其他的事务已经在使用这里的数据,锁会被它们持有。在悲观系统中,如果有锁冲突,就会造成延时等待,为正确性而牺牲性能。
乐观并发控制:不用担心其他事务是否正在读写你要使用的数据,而是自顾自地继续执行。通常来说这些执行会有一些临时区域,只有在事务最后的时候才会检查是不是有其他事务干扰了你。这样做的优点是不用承担锁带来的性能损耗,缺点是如果有其他事务在同一时间修改了你关心的数据并造成冲突,那么必须Abort当前事务并重试。
悲观并发控制涉及的基本就是锁机制。这里的锁是两阶段锁(Two-Phase Locking)。
当事务需要使用一些数据记录的时候,
数据库的原子性是指事务的每一个部分都执行,或者任何一个部分都不执行。常用来达到原子性的方法是使用原子提交协议(Atomic Commit Protocols)。对于分布式系统,通常来说,原子提交协议的工作是帮助计算机决定是否能执行这个操作,是否执行了某个操作,或者出错了的时候所有计算机都要获得消息并且不再执行(回退)自己的操作。两阶段提交是一种原子提交协议,不仅被分布式数据库使用,也被各种分布式系统使用。
【在各种故障场景下考虑两阶段提交协议对原子性的保障】
对于协调者:
对于参与者:
两阶段提交的效率很低,因为它要求事务涉及的所有参与者都能正常工作。因此,两阶段提交虽然具备故障下的正确性,但不具备可用性。可以结合raft协议,对每个参与者节点构建一个raft集群,结合两阶段提交和raft协议的思想来同时获得高可用和原子提交。
版权说明 : 本文为转载文章, 版权归原作者所有 版权申明
原文链接 : https://www.cnblogs.com/MiaoMiaoGarden/p/15755886.html
内容来源于网络,如有侵权,请联系作者删除!