我不会直接回答您的问题,而是尝试解释如何使用 Paxos 实现数据库事务,也许这将有助于理清问题。
首先要注意的是这里有两个“值”有问题。首先是数据库值,即正在修改的应用程序级数据。其次是“提交”/“中止”决定。对于基于 Paxos 的交易,共识“价值”是“提交”/“中止”决策。
关于 Paxos 共识的数据库事务要记住的重要一点是,Paxos 不保证事务中涉及的所有对等方都会真正看到共识决策。当需要这样做时,就像通常使用数据库一样,它留给应用程序来确保发生这种情况。这意味着一些对等点存储的状态可能落后于其他点,任何构建在 Paxos 之上的数据库应用程序都需要一些机制来处理这个问题。这可能非常复杂,并且都是特定于应用程序的,所以我将完全忽略所有这些,并专注于确保所有数据库副本中的简单多数同意数据库密钥 FOO 的修订版 2 的值,当然,最初设置为 BAR。
第一步是发送 FOO 的新值,假设它是 BAZ,它是预期的当前版本 1,以及 Paxos Prepare消息。当数据库副本收到此消息时,它们将首先查找 FOO 的本地副本并检查当前修订是否与准备消息中包含的预期修订匹配。如果它们匹配,则数据库副本将捆绑一个“Vote Commit”标志以及响应Prepare发送的Promise消息。如果它们不匹配,则将发送“投票中止”(修订检查可防止自应用程序上次读取值以来修改值的情况。
一旦事务驱动程序接收到一定数量的Promise消息及其关联的“Vote Commit”/“Vote Abort”值,它必须选择提议“Commit”或“Abort”。选择此值的第一步是遵循 Paxos 的要求,检查Prepare消息以查看是否有任何数据库副本(Paxos 术语中的Acceptor)已经接受了“提交”/“中止”决定。如果其中任何一个具有,则事务驱动程序必须选择与先前接受的最高提案 ID 关联的“提交”/“中止”值。如果他们没有,它必须自己决定。这是通过查看“投票提交”/“投票中止”来完成的s。如果存在法定人数的“Vote Commit”,则事务驱动程序可以提议“Commit”,否则必须提议“Abort”。
从那时起,所有标准的 Paxos 消息都会来回交换,直到就“提交”/“中止”决定达成共识。假设选择了“提交”,数据库复制者将分别将与 FOO 关联的值和修订更新为 BAZ 和 2。