分布式事务的维基百科文章并不是很有用。
你能不能简单介绍一下什么是分布式事务,更详细地说明一下?
另外,你能否给出一个应用程序或数据库应执行更新两个或多个网络计算机上的数据的事务的示例?
我了解经典的银行示例;我更关注像Dynamo、Bigtable、HBase或Cassandra等Web规模数据库中的分布式事务。
分布式事务的维基百科文章并不是很有用。
你能不能简单介绍一下什么是分布式事务,更详细地说明一下?
另外,你能否给出一个应用程序或数据库应执行更新两个或多个网络计算机上的数据的事务的示例?
我了解经典的银行示例;我更关注像Dynamo、Bigtable、HBase或Cassandra等Web规模数据库中的分布式事务。
通常,事务发生在一个数据库服务器上:
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
困难在于服务器必须 通信,以确保事务属性(如原子性)在两个服务器上得到满足:如果事务成功,值必须在两个服务器上更新。如果事务失败,则必须在两台服务器上回滚事务。绝不能出现在一个服务器上更新值,而在另一个服务器上未更新的情况。
分布式事务是跨越多台计算机工作的事务。假设您在计算机A上的某个程序方法中启动了一个事务。然后,在计算机A的该方法中更改了一些数据,随后该方法调用计算机B上的Web服务。计算机B上的Web服务方法失败并回滚了事务。由于事务是分布式的,这意味着在计算机A上所做的任何更改也需要回滚。Windows分布式事务协调器和.NET框架的组合便利了此功能。
通常情况下,分布式事务涉及多个物理服务器。有两类分布式事务:
在分布式数据库中更新数据,这是一个逻辑数据库,但数据存储在多个物理服务器上。例如Google的Spanner或PingCAP的TiDB。在这些情况下,DB系统负责分布式事务,开发人员无需关心。
在多个数据库或多个服务中更新数据。在微服务的背景下,优惠券、账户、支付等可能是您订单系统的独立服务。在这种情况下,开发人员应确保更新的原子性。如果事务成功,则必须在两个服务器上更新值。如果事务失败,则必须在两个服务器上回滚事务。绝不能出现在一个服务器上更新值而在另一个服务器上未更新的情况。本文 分布式事务管理的七种经典解决方案 对分布式事务进行了深入讨论。