springcloud整合seata出现异常数据未回滚的解决方案-爱代码爱编程
问题解析
按照官网和网上的教程对SpringCloud的项目与Seata进行的整合,发现出现异常的时候。
1. seata-server日志中并没有产生报错信息
2. 服务中也没有出现seata相关的报错信息
3. debug发现undo_log表中存在回滚日志
4. 两个服务之间都打印了全局XID,xid一致
java System.out.println("seata全局事务id====================>" + RootContext.getXID());
但是数据一直没有回滚。
通过不断的排查发现,原来是A服务远程调用B服务的时候,A服务这边有全局异常捕获。
当B服务出现异常时,A服务远程调用拿到异常后,被全局捕获了,但是并没有抛出异常。
导致seata认为异常已被手动处理,所以无法进行数据回滚。
其实seata的事务与我们普通的事务一样,会出现try-catch吞异常的问题。如果捕获异常之后,没有抛出异常,会导致事务失效。
这个点也蛮坑的。我们一般的服务都会做全局异常捕获,然后封装到JSON中返回给前端,后续引入seata后可能会考虑不到这块的内容,所以导出出现了问题一直不知道哪里产生的。
解决方案
针对一些特殊的异常捕获之后,不要吞异常,将异常抛出被seata感知到,然后进行数据回滚。