解决方案
1,参考了网上一位大神的例子,说用Spring AOP来进行手动开启全局事务ID和事务回滚,貌似没啥欧用,可能我用法不对,代码如下
/**
* @author jxys
* @since 2020年6月8日09:37:55
* 类描述: 用于处理程序调用发生异常的时候由于异常被处理以后无法触发事务,而进行的处理,使之可以正常的触发事务。
*/
@Aspect
@Component
public class WorkAspect {
private final static Logger logger = LoggerFactory.getLogger(WorkAspect.class);
//io.seata.saga.engine.invoker
@Before("execution(* com.jxysgzs.service.local.*.*(..))")
public void before(JoinPoint joinPoint) throws TransactionException {
MethodSignature signature = (MethodSignature)joinPoint.getSignature();
Method method = signature.getMethod();
GlobalTransaction tx = GlobalTransactionContext.getCurrentOrCreate();
tx.begin(300000, "test-client");
logger.info("**********创建分布式事务完毕" + tx.getXid());
}
@AfterThrowing(throwing = "e", pointcut = "execution(* com.jxysgzs.service.local.*.*(..))")
public void doRecoveryActions(Throwable e) throws TransactionException {
logger.info("方法执行异常:{}", e.getMessage());
if (!StringUtils.isBlank(RootContext.getXID())) {
GlobalTransactionContext.reload(RootContext.getXID()).rollback();
}
}
}
2.直接在降级方法里面手动回滚
try {
GlobalTransactionContext.reload(RootContext.getXID()).rollback();
} catch (TransactionException e) {
e.printStackTrace();
}