在article on BASE as an ACID alternative中,Dan Pritchett提出了一个选项,用于解耦跨越两个表的事务, Transaction 表(例如买/卖交易)和用户表:
丹还表示这种方法存在问题:
消息持久性在事务主机上以避免2PC 在排队期间。如果消息在事务内出列 涉及用户主机,我们仍然有2PC情况。
我假设消息传递是持久消息传递,因此保证了传递。在这种情况下,我希望Dequeue操作对Queue操作没有影响,从而完全解耦 Transaction 和 User 表的更新,从而避免这两者之间的2PC表?会有2PC,但那将是:
2PC边界1:
2PC边界2:
是否有人能够澄清我在想错的地方?
答案 0 :(得分:1)
将有2PC,但那将是:
TL; DR :您对这两个交易是正确的,但第一个是不是 2PC,而第二个是。这就是图5所描述的。 2PC是为什么"我们仍然有2PC情况"。
这篇文章有一些困难。 transaction
表与数据库事务无关,应调用purchases
。 "持久队列"只是一个表示更改队列的表。此外,它不断提出非解决方案有问题"。
使用BASE的提议涉及用两个表user_less_delta
和delta
替换用户表,这两个表一起提供与user
相同的信息。 (然后它使用" user
"但user_less_delta
但我会使用不同的名称。)但delta
保留在{{1}的主机上}}。也就是说它不需要2PC来实现涉及purchases
purchases
的交易,但需要2PC来实现涉及delta
和user_less_delta
的交易。
图5 BASE松弛是原子地交易(不含2PC)delta
与purchases
然后分别原子地2PC交换delta
与user_less_delta
的各种变化。这样,我们就不必每次更新delta
user_less_delta
而purchases
,user_less_delta
不会像user
那样准确。然而,这仍然假定
使用user_less_delta
更新delta
的2PC。
我不知道你的意思是"边界"。 (其他语言如"持久性消息传递"也不清楚。)但有两种交易:purchases
上的非2PC交易delta
和{{1}上的2PC交易与user_less_delta
。
丹还表示这种方法存在问题:消息持久性在事务主机上,以避免在排队期间出现2PC。如果消息在涉及用户主机的事务中出列,我们仍然有2PC情况。
"问题"有了这个解决方案,还有2PC参与其中。 "如果"应该只是"因为"因为否则代码不能正确实现分布式表。由于消息在涉及用户主机的事务中出列,我们仍然有2PC情况。
该文章继续(据称)删除2PC,delta
反映在delta
没有2PC,但是user_less_delta
反映在user_less_delta
没有2PC另一个。已经处理的delta
中的更改将被忽略。 (等等!我还没读过那么远!现在我已经知道了,那就是他们的建议。)
(基本上每个分布式网站尝试更新并确认另一个网站,并且收到确认后会提升其已确认的内容和尚未确认的内容。一种红色女王&#39 ;比赛结束2PC。)