将有 2PC,但这将是:
TL; DR:您对两笔交易是正确的,但第一笔不是2PC,而第二笔是。这就是图 5 所描述的。2PC 就是为什么“我们仍然有 2PC 的情况”。
文章有一些困难。该transaction
表与数据库事务无关,应称为purchases
. “持久队列”只是一个代表更改队列的表。此外,它不断提出有“问题”的非解决方案。
使用 BASE 的提议涉及用两个表替换用户表user_less_delta
,delta
它们一起提供与user
. (然后它使用“ user
”表示,user_less_delta
但我将使用单独的名称。)但是delta
在主机上使用purchases
. 即它不需要 2PC 来实现涉及purchases
with的事务,delta
但确实需要 2PC 来实现涉及user_less_delta
with的事务delta
。
图 5 BASE 松弛是原子地处理(没有 2PC)purchases
,delta
然后分别原子地处理 2PC 的各种user_less_delta
变化delta
。这使我们不必在每次更新时都进行 2PC 更新user_less_delta
,purchases
但代价是user_less_delta
不如user
. 然而,这仍然假设 2PCs 用于user_less_delta
更新delta
。
我不知道你所说的“边界”是什么意思。(“持久消息传递”等其他语言也不清楚。)但是有两种事务:在 with 上的非 2PC 事务和在withpurchases
上的delta
2PC 事务。user_less_delta
delta
Dan 还认为这种方法存在问题:
消息持久化在事务主机上,以避免排队期间的 2PC。如果消息在涉及用户主机的事务中出列,我们仍然有 2PC 的情况。
此解决方案的“问题”是仍然涉及 2PC。“If”应该只是“Since”,否则代码无法正确实现分布式表。由于消息在涉及用户主机的事务中出列,我们仍然有 2PC 的情况。
该文章继续(据称)通过以一种速率反映在没有 2PC 的情况下但在另一种情况下delta
反映在没有 2PC 的情况下来移除2PC。已处理的更改将被忽略。(等等!我还没有读到那么远!好的,现在我有,这就是他们的建议。)user_less_delta
user_less_delta
delta
delta
(基本上每个分布式站点都会尝试更新和确认另一个站点,并且在收到确认时会推进其已确认和尚未确认的版本。一种完成 2PC 的红皇后竞赛。)