分布式事务之XA协议
业务场景
首先先来看一个物业缴费的业务场景,用户收到缴费单之后进行缴费,分为三步,第一步扣减用户余额,第二步修改订单状态未已缴费,第三步增加物业管理金额。现在我们假设用户余额,订单以及物业管理金额分别在三个不同的数据库中,并且假定在同一个服务中(即单服务多数据源场景,注意与多服务多数据源做区分,区别在于是否需要全局的TM,文章后续介绍)
本地事务方案
public void pay() {
ownerAccountTransation.begin();
orderTransation.begin();
adminTransation.begin();
try{
ownerAccountService.pay();
orderService.update();
adminService.income();
ownerAccountTransation.commit();//【1】
orderTransation.commit();//【2】
adminTransation.commit();//【3】
}catch (Exception e){
ownerAccountTransation.rollback();//【4】
orderTransation.rollback();//【5】
adminTransation.rollback();//【6】
}
}
从代码中其实很容易发现问题,因为此处实际上是存在了三个事务,并非一个事务。如果代码执行到【2】时发生了异常,直接跳转至【4】但是由于【1