首页 理论教育分布式数据库技术:变形2PC

分布式数据库技术:变形2PC

【摘要】:假设提交2PC协议是以没有事务信息存在为基础的。简单变形这个协议可以解决这个问题,我们把这个变形称为假设提交2PC。参与者进入COLLECTING状态,然后发送prepare消息和进入WAIT状态。如果参与者接收一条global-abort消息,则写下一条abort记录并给出答复。

2PC有效,但是在性能上也常给人以口舌。有两种2PC的变形可以改进性能,其实现方式是通过以下一种途径来实施。

●减少协调者和参与者间传递的消息数。

●减少写入日志的次数。

这些相关协议称为假设夭折(presumed abort)2PC协议和假设提交(presumed commit)2PC协议。假设夭折2PC协议是一个优化处理只读事务和更新事务的协议,这类更新在别人对数据库进行更新时不实施更新(所以也称部分更新)。假设提交2PC协议优化通用更新事务的处理。

1.假设夭折2PC协议

在假设夭折2PC协议里做出如下假设:无论什么时候,只要参与者向协调者进行事务结局的投票,如果虚拟存储器中没有关于它的相关信息,则对询问的响应默认为夭折事务。这么做的原因是,如果是提交,则协调者不会忘记这个事务,且会一直等待所有参与者的答复,直到不再询问该事务为止。

使用这个惯例,协调者在其决定夭折事务以后就可以立即忘记该事务。虚拟存储器可以将abort记录写入日志,无须苦苦等待协调者对夭折事务的响应。其实,在abort记录后,协调者也无须再写end-of-transaction记录。(https://www.chuimin.cn)

参与者无须强制写abort记录,因为如果节点在收到决策前发生故障,然后恢复,恢复例程会检查日志决定事务的结局。如果找不到记录,则会询问协调者,协调者会告诉它已为夭折事务。所以参与者无须强制写abort记录。

因为减少了传输的消息,所以假设夭折2PC协议更有效。

2.假设提交2PC协议

假设夭折2PC协议一旦决策为夭折事务,就忘记该事务,从而改进了性能。因为大多数事务希望提交,所以类似的事务可以使用假设提交2PC协议。

假设提交2PC协议是以没有事务信息存在为基础的。但不要简单地把它看成是假设夭折2PC协议的对偶,因为一个准确的对偶要求协调者在其决定提交后忘记该事务,不强制commit记录(还有参与者的ready记录),提交命令也无须答复。我们看如下场景,协调者发送prepare消息并开始收集信息,但在收集到全部信息及做出决策前出现故障。此时,参与者等待一会,然后将事务转入恢复程序。一方面,因为没有关于该事务的信息,所以每个参与者的恢复例程将提交该事务。另一方面,协调者在其恢复时间夭折该事务,从而造成不一致。

简单变形这个协议可以解决这个问题,我们把这个变形称为假设提交2PC。这个协调者在发送prepare消息前,强制写一个收集记录,包括涉及正在执行的所有事务的参与者的名字。参与者进入COLLECTING状态,然后发送prepare消息和进入WAIT状态。参与者收到prepare消息后决定如何处理事务,按照自己的选举处理。协调者从所有参与者处收到决策,做出提交或夭折记录。如果决定夭折事务,协调者写下abort记录,然后进入ABORT状态,发送一条global-abort消息。如果决定提交事务,则会写下一条commit记录,然后发送global-commit命令,忘记该事务。在参与者接收到global-commit消息后,参与者会写下commit记录,并更新数据库。如果参与者接收一条global-abort消息,则写下一条abort记录并给出答复。协调者接收到夭折答复就写下一条end记录,忘记该事务。