举例:下订单,减库存,增加用户积分 几个微服务
1 检查下springboot,spring cloud,spring cloud alibaba 的版本关系
<spring-boot.version>2.7.13</spring-boot.version>
<spring-cloud.version>2021.0.8</spring-cloud.version>
<spring-cloud-alibaba.version>2021.0.5.0</spring-cloud-alibaba.version>
2 添加依赖,每个服务参与方都需要
<!-- seata -->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-seata</artifactId>
<exclusions>
<!-- 要与seata服务端版本一直,所以把自带的替换掉 -->
<exclusion>
<groupId>io.seata</groupId>
<artifactId>seata-spring-boot-starter</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>io.seata</groupId>
<artifactId>seata-spring-boot-starter</artifactId>
<version>1.4.2</version>
</dependency>
<!-- seata ,jackson序列化日期类型出错 -->
<dependency>
<groupId>com.esotericsoftware</groupId>
<artifactId>kryo</artifactId>
<version>4.0.2</version>
</dependency>
<dependency>
<groupId>de.javakaffee</groupId>
<artifactId>kryo-serializers</artifactId>
<version>0.42</version>
</dependency>
3 修改配置文件,这里用AT模式,每个服务参与方都需要 ,特别注意事务组
seata:
enabled: true
application-id: ${spring.application.name}
# 事务组的名称,对应service.vgroupMapping.default_tx_group=xxx中配置的default_tx_group
tx-service-group: mytestshiwu
# 配置事务组与集群的对应关系
service:
vgroup-mapping:
# default_tx_group为事务组的名称,default为集群名称(与registry.conf中的一致)
mytestshiwu: default
disable-global-transaction: false
# 注册中心 支持: nacos, eureka, redis, zk, consul, etcd3, sofa
registry:
type: nacos
nacos:
application: seata-server
server-addr: 127.0.0.1:8848
group: SEATA_GROUP
namespace: f554db54-7c9d-4123-b6b8-7dde45a8f89b
username: nacos
password: nacos
# registry.conf中,配置cluster名称
cluster: default
# 配置中心 支持: nacos, consul, apollo, zk, etcd3
config:
type: nacos
nacos:
server-addr: 127.0.0.1:8848
group: SEATA_GROUP
namespace: f554db54-7c9d-4123-b6b8-7dde45a8f89b
username: nacos
password: nacos
# nacos配置中心配置的dataId
data-id: seataServer.properties
data-source-proxy-mode: AT
4 每个微服务对应的数据库增加undo_log表(数据回滚使用)
SET NAMES utf8mb4;
SET FOREIGN_KEY_CHECKS = 0;
-- ----------------------------
-- Table structure for undo_log
-- ----------------------------
DROP TABLE IF EXISTS `undo_log`;
CREATE TABLE `undo_log` (
`id` bigint(20) NOT NULL AUTO_INCREMENT,
`branch_id` bigint(20) NOT NULL,
`xid` varchar(100) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL,
`context` varchar(128) CHARACTER SET utf8 COLLATE utf8_general_ci 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) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,
PRIMARY KEY (`id`) USING BTREE,
UNIQUE INDEX `ux_undo_log`(`xid`, `branch_id`) USING BTREE
) ENGINE = InnoDB AUTO_INCREMENT = 24127 CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Dynamic;
SET FOREIGN_KEY_CHECKS = 1;
5 在事务发起方服务的方法上添加 @GlobalTransactional() 注解,这里用的用户服务,
强烈建议不要用try catch,直接throws就完了
@GlobalTransactional(name = "Transactional_a",rollbackFor = Exception.class)
public Integer addOrder() throws Exception {
业务代码
}
配置文件中 容易出错的地方,需要和seata安装配置文件,nacos配置中心的对应上,如图
1 事务组,集群名称 和 nacos配置中心中的配置对应
# 事务组配置
service.vgroupMapping.mytestshiwu=default
service.default.grouplist=127.0.0.1:8091
# seata,jackson序列化日期
client.undo.logSerialization=kryo
2 seata安装文件中 registry.conf 的信息
# 注册中心
nacos {
application = "seata-server"
serverAddr = "127.0.0.1:8848"
group = "SEATA_GROUP"
namespace = "f554db54-7c9d-4123-b6b8-7dde45a8f89b"
cluster = "default"
username = "nacos"
password = "nacos"
}
# 配置中心
nacos {
serverAddr = "127.0.0.1:8848"
namespace = "f554db54-7c9d-4123-b6b8-7dde45a8f89b"
group = "SEATA_GROUP"
username = "nacos"
password = "nacos"
dataId = "seataServer.properties"
}