可举例:购物,走DB,库存-1,买家扣钱。 1:库存 2:查询到还有库存,下单,调用支付API扣钱 3:银行卡扣钱 4:判断1、3的结果
分析以上步骤可能抛出异常的情景:
步骤1发生异常,Spring事务回滚
步骤2发生异常,Spring事务回滚
步骤3发生异常,3的服务实现自动回滚,2根据3的返回值来决定是否回滚
步骤四出险异常,1自动回滚,3的操作不会回滚,导致双方数据不同步。不符合同时成功、同时失败原则。
由于Spring的事务是基于单体的,所以Spring的事务并不适用于该情况。解决方法有LCN分布式事务框架和Seata分布式事务框架。
TCC(Try-Confirm-Cancel)
在企业级微服务解决方案中,我们可以使用LCN或Seata负责监控每个服务的事务。
以LCN为例:
服务发起方:Feign调用其他服务
@TxTransaction(isStart = true)
@Transactional(rollbackFor = Exception.class)
public void save(){
//do something
}
服务被调用方
@TxTransaction
@Transactional(rollbackFor = Exception.class)
public void save() {
}