代码编织梦想

SpringCloud整合Seata出现异常数据未回滚的解决方案

SpringCloud整合Seata1.6.1部署与使用Nacos方式

问题解析

按照官网和网上的教程对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感知到,然后进行数据回滚。

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/weixin_40777510/article/details/129685517

hadoop集群---方便的脚本-爱代码爱编程

目录 为什么编写脚本? myhadoop.sh 群起集群、关闭集群脚本 1、配置 2、启用 jpsall 查看三台主机进程脚本 1、配置 2、启用 xsync 分发脚本 1、配置 2、启用 为什么编写脚本? 方便 myhadoop.sh 群起集群、关闭集群脚本 1、配置 在 root/bin 目录下创建脚本 (在