分布式事务Saga (一) TCC vs Saga
分布式事务Saga(二)事务管理者SagaTransactionalAspect
分布式事务Saga(三)事务参与方管理SagaParticipantAspect
分布式事务Saga(四)事务恢复SagaRecoveryManager
项目地址:https://github.com/yangxb2010000/saga
直接看spring-cloud版的demo
下面是项目的时序图,主要组件如下
SagaTransactionalAspect AOP拦截SagaTransactional注解,负责创建、提交、回滚事务
SagaParticipantAspect AOP拦截SagaParticipant注解,负责添加事务参与方到当前事务中
OrderServiceImpl 订单服务实现, 创建订单并扣库存、支付
AccountClient 账户服务的Rpc Client, 调用支付操作
InventoryClient 库存服务的Rpc Client, 调用扣减库存操作
直接看demo的代码
当前看的是spring-cloud版的demo,入口为OrderController的 orderPay方法,这个地方的代码没什么好说的,直接进入orderService.orderPay的实现方法中
orderPay方法中创建并保存订单,生产订单号,当前demo中创建订单逻辑并没有参与到事务中,核心事务逻辑在paymentService.makePayment(order)中
下面看到makePayment的实现方法上有@SagaTransactional注解,所以在执行的时候就会被SagaTransactionalAspect拦截,继续看Aop拦截的代码
SagaTransactionalAspect主要用来收集当前拦截方法的一些信息,主要拦截代码的实现在SagaTransactionalInterceptor.intercept中
SagaTransactionalInterceptor中的代码还是比较好理解的,可以看图片中的注释,主要事务的实现逻辑被封装到了TransactionManager中
TransactionManager开启事务,其实就是创建一个Transaction对象,放入ThreadLocal中
TransactionManager回滚事务
TransactionManager释放事务资源