最近,我一直在阅读有关数据库分片和数据库并发控制以及ACID属性的信息,并且我一直在考虑一些对我来说有点棘手的场景。
假设我们想要一笔从一个账户到另一个账户的汇款交易。假设我们有按国家/地区分片的客户(帐户(,例如美国客户位于与欧洲客户分开的特定服务器上(为了可扩展性(
此类系统的事务应如下所示:
BEGIN TRANSACTION
UPDATE FROM Account SET balance = balance - 100.0 WHERE id = 1;
UPDATE FROM Account SET balance = balance + 100.0 WHERE id = 2;
COMMIT;
1-假设帐户#1来自欧洲,帐户#2来自美国。在这种情况下,如何保持酸的特性?因为从应用程序中,我们将与每个分片(单独的数据库服务器(进行不同的会话,这意味着不同的事务!
2-这也可能是检测死锁的问题,如果上述事务将由2个不同的线程以不同的顺序执行,我们如何检测并发应用程序中的死锁!
我知道如果我们只有 1 个数据库保存所有记录,这很容易完成,因为它可以完全控制数据,但在分布式数据库中,我相信我们可能确实需要与不同的数据库进行一些通信,或者可能需要一个中央代理来处理这种情况!
您需要的是共识算法,以便账户 1 和账户 2 都可以同意它们之间发生了 100 美元的交易。
这是一个非常广泛的话题,因为拥有博士学位的人只研究共识算法。 著名的共识算法列表是:
- 帕克索斯
- 筏
- 两阶段提交
我将从 2 阶段提交(上面所有 3 个中最简单的(开始,如果极端性能的标准可以降低一点。