上文中提到发布TCC服务只需在service实现类的方法上加@Compensable ,那么该方法就变为TCC中的try方法:
@Compensable(confirmMethod = "confirmRecord", cancelMethod = "cancelRecord", transactionContextEditor = MethodTransactionContextEditor.class)
public String record(TransactionContext transactionContext, CapitalTradeOrderDto tradeOrderDto) {
接下来看看该注解具有哪些属性、框架又是如何感知该注解,框架感知注解后又做了哪些事?
在tcc-transaction-api中定义了该注解:
1、注解定义:
具体属性有 Propagation REQUIRED(0),SUPPORTS(1),MANDATORY(2),REQUIRES_NEW(3) 事务传播特性, confirmMethod 方法名,cancelMethod 方法名,asyncConfirm 是否异步确认,asyncCancel 是否异步取消,TransactionContextEditor 事务上下文(目标类、方法名、参数)。
2、TCC事务框架如何感知用户开启分布式事务?
tcc-transaction-core 中有两个重要的类配置@Aspect AOP 切面( 参与者 try 方法 )进行拦截 @Compensable事务注解,获取注解信息(事务传播特性、注解所在类名、confirm方法名、cancel方法名、注解方法参数列表),接下来我们框架在TCC分布式事务中具体做了哪些坏事??
第一个重要的类ConfigurableTransactionAspect:
ConfigurableTransactionAspect继承了CompensableTransactionAspect类,那么且看父类中具体做了那些事,
CompensableTransactionAspect类就是前文中提到的@Aspect AOP切面。
位置1、定义切面
位置2、定义切入点,拦截所有被@Compensable注解的方法,即拦截所有TCC中的try方法,也就是拦截下边这种代码。
@Compensable(confirmMethod = "confirmRecord", cancelMethod = "cancelRecord", transactionContextEditor = MethodTransactionContextEditor.class)
public String record(TransactionContext transactionContext, CapitalTradeOrderDto tradeOrderDto) {
位置3、在所拦截方法的前后执行3中的compensableTransactionInterceptor.interceptCompensableMethod(pjp)代码(后续重点解读该处代码)
总结:到此为止框架已成功拦截所有@Compensable注解的方法,并且获取Compensable注解的属性,即框架已成功感知用户使用TCC框架,下文继续分享框架感知@Compensable注解后具体又是如何做分布式事务的?