seata解决多服务分布式事务(下)
接下来配置客户端(业务代码)
一、引入maven依赖
<!--注册中心客户端-->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
<version>2.2.1.RELEASE</version>
</dependency>
<!--配置中心客户端-->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
<version>2.2.1.RELEASE</version>
</dependency>
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-boot-starter</artifactId>
<version>3.5.0</version>
</dependency>
<!--引入seata相关依赖-->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-seata</artifactId>
<version>2.2.1.RELEASE</version>
</dependency>
二、配置文件application.yml
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 server: 2 port: 4000 3 4 spring: 5 application: 6 name: @artifactId@ 7 cloud: 8 nacos: 9 discovery: 10 server-addr: 127.0.0.1:8848 11 #保证和seata在同一个nacos注册分组下面 12 group: SEATA_GROUP 13 namespace: 67de56c9-697d-41b7-adbe-1322dd3a5166 14 config: 15 server-addr: 127.0.0.1:8848 16 #保证和seata在同一个nacos配置分组下面 17 group: SEATA_GROUP 18 namespace: 67de56c9-697d-41b7-adbe-1322dd3a5166 19 file-extension: yml 20 datasource: 21 url: jdbc:postgresql://127.0.0.1:5432/test?useUnicode=true&characterEncoding=UTF-8&allowMultiQueries=true&useSSL=false&pinGlobalTxToPhysicalConnection=true 22 username: test 23 password: 123456 24 seata: 25 enabled: true #开启seata支持 26 tx-service-group: default_tx_group #这里需要和config.txt 文件中的service.vgroupMapping.my_test_tx_group=default一致 27 enable-auto-data-source-proxy: true #是否动态代理数据源 28 #seata整合nacos配置中心,读取seta-client中的一些配置 29 config: 30 type: nacos 31 nacos: 32 server-addr: 127.0.0.1:8848 33 group: SEATA_GROUP #seata服务注册到nacos的组名SEATA_GROUP 34 namespace: 67de56c9-697d-41b7-adbe-1322dd3a5166 35 #seata整合nacos注册中心 36 registry: 37 type: nacos #配置微服务(业务代码 client)如何去访问seata服务端(事务协调者) 38 nacos: 39 server-addr: 127.0.0.1:8848 40 namespace: 67de56c9-697d-41b7-adbe-1322dd3a5166
备注:复制一份项目,配置相似。
三、在业务库中添加表undo_log
打开seata服务端中的文件README-zh.md
下载或拷贝对应类型的数据库文件,在需要分布式事务的业务数据库中执行。
四、业务代码编写
实体类略
@Service
public class Test1ServiceImpl extends ServiceImpl<Test1Mapper, Test1> implements ITest1Service {
@Autowired
private SeatabFeign seatabFeign;
@Autowired
private Test1Mapper test1Mapper;
@GlobalTransactional
// @Transactional
@Override
public void test(Integer id,Integer num) {
//先远程调用服务seata_b
seatabFeign.save(id);
Test1 t1 = new Test1();
t1.setId(id);
t1.setNum(num);
test1Mapper.insert(t1);
//异常
Integer i = 1/0;
}
}
使用@GlobalTransactional实现全局分布式事务,使用@Transactional实现本地事务,若抛出异常,则不会回滚远程事务。
备注:启动客户端(业务)服务可能报一下错误
这应该是该版本seata的jar包的bug。
我们根据提示跟踪类NettyClientChannelManager,找到对应的方法reconnect(String transactionServiceGroup)。
接着跟踪到类NacosRegistryServiceImpl的lookup(String key) 方法。
根据代码所只,此处是根据服务名称从nacos中获取seata集群列表,但是服务名称使用变量PRO_SERVER_ADDR_KEY写死了,因此只能在seata服务端的registry.conf中,将application写死为"serverAddr"。