#A服务调用B服务,seata事务失效
#背景: springboot两个微服务,seata,nacos
#问题:
1.是否必须使用rpc框架?(目前是手写http)
2.是否必须使用注册中心?
3.A服务绑定了xid,B服务也能拿到,为啥模拟异常后事务不生效
A服务:
@GlobalTransactional
@RequestMapping("test")
public R test() {
jdbcTemplate.update("INSERT INTO sys_user ( username) VALUES ( 'admin服务');");
HttpRequest.post("http://127.0.0.1:8081/sy-api/api/test").header(RootContext.KEY_XID, RootContext.getXID()).execute();
int i = 1 / 0;//模拟异常
return R.ok();
}
B服务:
@RequestMapping("test")
public R test() {
jdbcTemplate.update("INSERT INTO sys_user ( username) VALUES ( 'api服务');");
//int i = 1 / 0;
return R.ok();
}
不知道你这个问题是否已经解决, 如果还没有解决的话:问题1:是否必须使用rpc框架?目前我是手写http通信的方式,是否有更好的替代方案?
在seata中,使用rpc框架进行通信是必须的,因为seata依赖于分布式事务,而分布式事务需要统一的协调和管理。常用的rpc框架包括Dubbo、gRPC、Spring Cloud等,你可以选择一个适合你项目的框架来集成seata。
如果你目前使用的是手写的http通信方式,可以考虑将其改造成支持rpc通信的方式,具体步骤如下:
问题2:是否必须使用注册中心来管理服务?我对注册中心的作用还不是很清楚,是否可以绕过它直接使用seata?
在seata中,注册中心的作用是用来管理和注册被seata管控的服务实例。通过注册中心,seata可以动态地获取、管理和调用各个服务的实例。因此,使用注册中心是必须的,不能绕过。
常用的注册中心包括ZooKeeper和Nacos,你可以根据你的项目需求选择一个适合的注册中心,并集成到你的项目中。具体步骤如下:
问题3:我的服务A绑定了xid,但是当我模拟异常后,事务似乎没有生效。我想知道为什么会这样,可能是出了什么问题?
事务不生效的问题可能存在多种原因,下面是一些常见的可能原因和对应的解决方案:
如果经过以上步骤的检查和排查,问题仍然存在,请提供更多的详细信息和日志,以便进一步分析和解决。
以上是对问题的解答,如果有任何其他疑问,请随时提出。