“分布式事务”是什么?

36

分布式事务的维基百科文章并不是很有用。

你能不能简单介绍一下什么是分布式事务,更详细地说明一下?

另外,你能否给出一个应用程序或数据库应执行更新两个或多个网络计算机上的数据的事务的示例?

我了解经典的银行示例;我更关注像Dynamo、Bigtable、HBase或Cassandra等Web规模数据库中的分布式事务。


你明白“正常”交易是什么意思吗? - Matt Ball
6
@Matt Ball: 好的!这个问题涉及“分布式”事务。 - Zombie
6个回答

36

通常,事务发生在一个数据库服务器上:

BEGIN TRANSACTION
SELECT something FROM myTable
UPDATE something IN myTable
COMMIT

分布式事务涉及多个服务器:

BEGIN TRANSACTION
UPDATE amount = amount - 100 IN bankAccounts WHERE accountNr = 1
UPDATE amount = amount + 100 IN someRemoteDatabaseAtSomeOtherBank.bankAccounts WHERE accountNr = 2
COMMIT

困难在于服务器必须 通信,以确保事务属性(如原子性)在两个服务器上得到满足:如果事务成功,值必须在两个服务器上更新。如果事务失败,则必须在两台服务器上回滚事务。绝不能出现在一个服务器上更新值,而在另一个服务器上未更新的情况。


14
分布式事务跨越多个物理系统,而标准事务不会。系统之间的同步需要在传统标准事务中不存在。
从您提供的维基百科参考中可以得出:
分布式事务可视为必须在分布于不同物理位置的多个参与数据库之间进行同步(或提供ACID属性)的数据库事务。

+1 for the quote. 对我来说,ACID本身就是一个相当明确的定义。 - Dunaril

7

分布式事务是跨越多台计算机工作的事务。假设您在计算机A上的某个程序方法中启动了一个事务。然后,在计算机A的该方法中更改了一些数据,随后该方法调用计算机B上的Web服务。计算机B上的Web服务方法失败并回滚了事务。由于事务是分布式的,这意味着在计算机A上所做的任何更改也需要回滚。Windows分布式事务协调器和.NET框架的组合便利了此功能。


2
我尝试在这篇文章中展示了分布式事务的细节,链接如下:《分布式(XA)交易性能调优-怎么做?》
对于分布式事务来说,好的数据应该具有非常高的一致性要求。通常这是指金钱或其他我们不能容忍过时数据的东西。我通常将数据分为两类:即实时数据和不需要立刻正确性/一致性的数据。
现在是关于Dynamo、Bigtable、HBase或Cassandra的第二部分问题。
你不能将NoSQL数据库和分布式事务进行对比。这种数据库类型的存在是为了避免使用分布式事务。分布式事务的核心是一致性,而NoSQL存储则以可用性和分区为核心。
这类数据库通常采用最终一致性的事务模型。

我是否无法在No-SQL数据库上执行事务?选择CA或CP而非AP的数据库类呢?像亚马逊这样的组织是否会在其订单管理中使用必须进行交易的SQL数据库? - Gautam Jain

1
分布式事务是指在分布式数据库上进行的事务(即数据存储在多个物理独立系统上)。这很值得注意,因为涉及到相当复杂的问题(特别是在通信方面),以确保所有机器保持一致,因此要么整个事务成功,要么似乎什么都没有发生。

1

通常情况下,分布式事务涉及多个物理服务器。有两类分布式事务:

  1. 在分布式数据库中更新数据,这是一个逻辑数据库,但数据存储在多个物理服务器上。例如Google的Spanner或PingCAP的TiDB。在这些情况下,DB系统负责分布式事务,开发人员无需关心。

  2. 在多个数据库或多个服务中更新数据。在微服务的背景下,优惠券、账户、支付等可能是您订单系统的独立服务。在这种情况下,开发人员应确保更新的原子性。如果事务成功,则必须在两个服务器上更新值。如果事务失败,则必须在两个服务器上回滚事务。绝不能出现在一个服务器上更新值而在另一个服务器上未更新的情况。本文 分布式事务管理的七种经典解决方案 对分布式事务进行了深入讨论。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接