准备环境
一、创建四个数据库,如下
jeecg_order(订单数据库)
jeecg_account(账户数据库)
jeecg_product(商品数据库)
seata(seata数据库)
以上数据库脚本已存放至 jeecg-cloud-test-seata 示例中,文件位置如下图所示
二、准备调试代码
1. 示例代码提供如下
- jeecg-cloud-test-seata-order(下单服务)
- jeecg-cloud-test-seata-product(库存服务)
- jeecg-cloud-test-seata-account(账户服务)
该示例场景用于下单时检测库存是否车充足,余额是否充足,有一个不满足是则回滚事务
2. seata 服务端代码
本次实践的 seata 版本为 v1.7.0,下载地址 https://seata.apache.org/zh-cn/unversioned/release-history/seata-server
安装服务端 下载下来进行解压,目录结构如下:
进入 bin 目录启动 seata,seata 默认端口是 8091
window 下运行seata-server.bat
linux 下运行seata-server.sh
-
- 修改 seata 服务端的 yml 配置
启动 seata,如下图 输入如下信息后表示启动成功
微服务模块添加依赖,具体参考示例代码
<dependency>
<groupId>org.jeecgframework.boot</groupId>
<artifactId>jeecg-boot-starter-cloud</artifactId>
<version>3.1.0</version>
</dependency>
<dependency>
<groupId>org.jeecgframework.boot</groupId>
<artifactId>jeecg-boot-starter-seata</artifactId>
<version>3.1.0</version>
</dependency>
微服务模块添加配置,具体参考示例代码
seata:
enable-auto-data-source-proxy: false
service:
grouplist:
default: 127.0.0.1:8091
vgroup-mapping:
springboot-seata-group: default
# seata 事务组编号 用于TC集群名
tx-service-group: springboot-seata-group
启动测试 依次启动 jeecg-cloud-test-seata-order(下单服务)
jeecg-cloud-test-seata-product(库存服务)
jeecg-cloud-test-seata-account(账户服务)
启动完成如下图 浏览器输入 http://localhost:5001
即可进行测试,如下图所示
测试正常下参数见截图
测试余额不足,测试库存不足,然后观察数据库订单表插入数据是否回滚
注:本示例不通过网关所以需要排除认证权限 ShiroConfig.java 添加如下代码
//测试模块排除
filterChainDefinitionMap.put("/test/seata/**", "anon");
可使用 nacos 作为 seata 的配置中心 新建 seataServer.properties 配置文件内容如下
# 数据存储方式,db代表数据库
store.mode=db
store.db.datasource=druid
store.db.dbType=mysql
store.db.driverClassName=com.mysql.cj.jdbc.Driver
store.db.url=jdbc:mysql://localhost:3300/seata?useUnicode=true&rewriteBatchedStatements=true&serverTimezone=Asia/Shanghai
store.db.user=root
store.db.password=root
store.db.minConn=5
store.db.maxConn=30
store.db.globalTable=global_table
store.db.branchTable=branch_table
store.db.queryLimit=100
store.db.lockTable=lock_table
store.db.maxWait=5000
# 事务、日志等配置
server.recovery.committingRetryPeriod=1000
server.recovery.asynCommittingRetryPeriod=1000
server.recovery.rollbackingRetryPeriod=1000
server.recovery.timeoutRetryPeriod=1000
server.maxCommitRetryTimeout=-1
server.maxRollbackRetryTimeout=-1
server.rollbackRetryTimeoutUnlockEnable=false
server.undo.logSaveDays=7
server.undo.logDeletePeriod=86400000
# 客户端与服务端传输方式
transport.serialization=seata
transport.compressor=none
# 关闭metrics功能,提高性能
metrics.enabled=false
metrics.registryType=compact
metrics.exporterList=prometheus
metrics.exporterPrometheusPort=9898