分布式事务使用场景
假设一个应用内存在多个需要协同工作的资源Resource(比如多个数据库DB,消息队列MQ等),他们需要协同修改并保证“一起成功,或者一起失败”,就是分布式事务的典型应用场景。
试想,一个电商平台的下单功能,把钱从用户账户扣除,同时下一个物流单的场景:
//伪代码
public void OrderService () {
// 进行如下操作
1. start database transaction A
2. sql,把钱从用户账户扣除
3. start 物流 shipment transaction B
4. 下物流单
5. commit 物流 shipment transaction B
// 物流单成功/出错了
6. commit database transaction A
}
- 如果物流单(资源B)成功,数据库(资源A)修改也提交
- 如果资源B出错了回滚,资源A修改也回滚。
在多个资源的情况下,需要一个协调者,这里称为事务管理器(Transaction Manager),来协调例子里的资源A和资源B的协同沟通。
分布式事务XA
以下定义引用自[1]. XA : XA是一个规范或是一个事务的协议。XA协议由Tuxedo首先提出的,并交给X/Open组织,作为资源管理器(Resource Manager)与事务管理器(Transaction Manager)的接口标准。
XA规范定义了:
1. TransactionManager : 可以通过管理多个ResourceManager来管理多个Resouce,也就是管理多个资源<