启动Seata
下载seata
registry {
# file 、nacos 、eureka、redis、zk、consul、etcd3、sofa
type = "nacos"
nacos {
serverAddr = "192.168.110.130"
namespace = "public"
cluster = "default"
}
}
config {
# file、nacos 、apollo、zk、consul、etcd3
type = "nacos"
nacos {
serverAddr = "192.168.110.130"
namespace = "public"
cluster = "default"
}
}
service.vgroup_mapping.product-service=default
service.vgroup_mapping.order-service=default
- 这里的语法为:
service-vgroup_mapping.${you-service-gruop}=default
,中间的${you-service-group}
为自己定义的服务组名称,这里需要我们在层序的配置文件中配置。
初始化seata在nacos的配置
# 初始化seata 的nacos配置
# 注意:这里要保证nacos已经正常运行的
cd conf
nacos-config.sh 127.0.0.1
- 执行成功后可以打开Nacos的控制台,在配置列表中,可以看到初始化了很多Group为SEATA_GROUP的配置。
启动seata服务
cd bin
seata-server.bat -p 9000 -m file
- 启动后在Nacos的服务列表下面可以看到一个名为serverAddr的服务。
使用Seata实现事务控制
初始化数据表
- 在我们的数据库中加入一张undo_log表,这是Seata记录事务日志要用到的表
CREATE TABLE `undo_log` (
`id` bigint(20) NOT NULL AUTO_INCREMENT,
`branch_id` bigint(20) NOT NULL,
`xid` varchar(100) NOT NULL,
`context` varchar(128) NOT NULL,
`rollback_info` longblob NOT NULL,
`log_status` int(11) NOT NULL,
`log_created` datetime NOT NULL,
`log_modified` datetime NOT NULL,
`ext` varchar(100) DEFAULT NULL,
PRIMARY KEY (`id`),
UNIQUE KEY `ux_undo_log` (`xid`,`branch_id`)
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8;
添加配置
- 在需要进行分布式控制的微服务中进行下面几项配置:
- 添加依赖
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-seata</artifactId>
</dependency>
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
</dependency>
- DataSourceProxyConfig
- Seata是通过代理数据源实现事务分支的,所以需要配置io.seata.rm.DataSourceProxy的Bean,且是@Primary默认的数据源,否则事务不会回滚,无法实现分布式事务
@Configuration
public class DataSourceProxyConfig {
@Bean
@ConfigurationProperties(prefix = "spring.datasource")
public DruidDataSource druidDataSource(){
return new DruidDataSource();
}
@Primary
@Bean
public DataSourceProxy dataSourceProxy(DruidDataSource druidDataSource){
return new DataSourceProxy(druidDataSource);
}
}
- registry.conf
- 在resource下添加Seata的配置文件registry.conf
registry {
# file 、nacos 、eureka、redis、zk、consul、etcd3、sofa
type = "nacos"
nacos {
serverAddr = "192.168.110.130"
namespace = "public"
cluster = "default"
}
}
config {
# file、nacos 、apollo、zk、consul、etcd3
type = "nacos"
nacos {
serverAddr = "192.168.110.130"
namespace = "public"
cluster = "default"
}
}
spring:
application:
name: service-product
cloud:
nacos:
config:
server-addr: 192.168.110.130:8848 #nacos中心地址
namespace: public
group: SEATA_GROUP
alibaba:
seata:
tx-service-group: ${spring.application.name}
在order微服务开启全局事务
@GlobalTransactional //开启全局事务
public Order createOrder(Integer pid) {}