在@GlobalTransactional
@Transactional
这两个注解同时使用的时候,使用手动回滚会在抛出异常。
GlobalTransactionContext.reload(RootContext.getXID()).rollback()
org.springframework.transaction.TransactionSystemException: JDBC commit failed; nested exception is java.sql.SQLException: io.seata.core.exception.RmTransactionException:
Response[ TransactionException[Could not register branch into global session xid = xxx status = Rollbacking while expecting Begin] ]
参考了https://seata.io/zh-cn/blog/seata-spring-boot-aop-aspectj.html 官方案例,和openFeign一起使用,但不论是在 被调用方 手动回滚,还是在发起方手动回滚,入口方法执行完,就会被 TransactionalTemplate中捕捉到。
但是尝试在发起方抛出异常,整个回滚流程是没问题的。去掉 @Transactional 也没问题
Object rs;
try {
// Do Your Business
rs = business.execute();
} catch (Throwable ex) {
// 3. The needed business exception to rollback.
completeTransactionAfterThrowing(txInfo, tx, ex); //手动回滚后,总是会回到这里
throw ex;
}
可以确认的是,被调用的服务在全局事务中,XID也能获取到。也已经看过faq 6和 22,但是没有解决
- JDK version :openjdk11
- Seata version: 1.5.2
- OS :manjaro
- Others: