具有并发控制和 ACID 属性的数据库分片

Database Sharding with Concurrency Control And ACID Properties

最近,我一直在阅读有关数据库分片和数据库并发控制以及 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 来自美国。在这种情况下如何保持 ACID 属性?因为在应用程序中,我们将与每个分片(独立的数据库服务器)进行不同的会话,这意味着不同的事务!

2- 这也可能是检测死锁的问题,如果上述事务将由 2 个不同的线程以不同的顺序执行,我们如何检测并发应用程序中的死锁!

我知道如果我们只有一个数据库来保存所有记录,这很容易完成,因为它可以完全控制数据,但在分布式数据库中,我相信我们可能确实需要与不同的数据库进行一些通信,或者也许处理此类案件的中央代理!

你需要的是共识算法,让账户1和账户2都同意他们之间发生了100美元的交易。

这是一个相当大的话题,拥有博士学位的人只研究共识算法。 著名的共识算法列表是:

  1. Paxos
  2. 木筏
  3. 两阶段提交

如果可以降低极限性能的门槛,我将从 2 阶段提交(上面所有 3 个中最简单的)开始。