文章目录
springcloud+seata+mybatis-plus Demo
在做这个demo的时候遇到了几个坑都已经解决了,有一个缺陷已经提交到seata的lssues中并且已经修改,下个版本应该会修复。(是因为数据库表名使用了关键字比如order。会导致项目报错)
项目架构
版本
- springboot version: 2.1.8.RELEASE
- springcloud version: Greenwich.SR2
- seata version: 0.8.1
- mybatis-plus version: 3.1.2
- 连接池采用springboot2.x默认的hikari
- mysql 8
模块
- springcloud-seata-mybatis 父工程
- eureka-server 服务发现
- seat-account 账户服务
- seat-order 订单服务
- seat-storage 库存服务
seata-server 服务端 version:0.8.1
地址: https://github.com/seata/seata/releases 解压后 配置文件所在目录为conf,bin中有启动脚本
server配置文件
因配置文件较长就不贴出来了,只贴修改的地方
file.conf
- service
service {
#vgroup->rgroup 这个(fsp_tx_group)必须和项目中配置的名一致 否则会报错
vgroup_mapping.fsp_tx_group = "default"
......
- store
## transaction log store
store {
## store mode: file、db 选择使用文件或者数据库如果选择数据库则下面的DB必须要配置
mode = "db"
## file store
file {
dir = "sessionStore"
# branch session size , if exceeded first try compress lockkey, still exceeded throws exceptions
max-branch-session-size = 16384
# globe session size , if exceeded throws exceptions
max-global-session-size = 512
# file buffer size , if exceeded allocate new buffer
file-write-buffer-cache-size = 16384
# when recover batch read size
session.reload.read_size = 100
# async, sync
flush-disk-mode = async
}
## database store 配置数据源
db {
## the implement of javax.sql.DataSource, such as DruidDataSource(druid)/BasicDataSource(dbcp) etc.
datasource = "dbcp"
## mysql/oracle/h2/oceanbase etc.
db-type = "mysql"
driver-class-name = "com.mysql.cj.jdbc.Driver"
url = "jdbc:mysql://192.168.171.101:3306/seata?useUnicode=true&characterEncoding=utf8&serverTimezone=Asia/Shanghai"
user = "root"
password = "root"
min-conn = 1
max-conn = 3
global.table = "global_table"
branch.table = "branch_table"
lock-table = "lock_table"
query-limit = 100
}
}
registry.conf
registry
registry {
# file 、nacos 、eureka、redis、zk、consul、etcd3、sofa 本demo采用eureka作为配置注册中心 config使用默认file就好
type = "eureka"
nacos {
serverAddr = "localhost"
namespace = ""
cluster = "default"
}
eureka {
serviceUrl = "http://127.0.0.1:8761/eureka"
application = "default"
weight = "1"
}
.....
SQL脚本
因seata-server中conf文件夹下带db_store.sql和db_undo_log.sql 此处不做阐述
Demo github地址:
github地址:点我到项目源码地址
关于项目配置文件
- application.yml 需要修改成你自己的数据源
- 需要导入sql(在项目resources下)
- 如果eureka端口发生改变请在registry.conf中同步更改eureka的地址
启动步骤
- 启动eureka
- 启动seata服务端
- 依次启动项目 seat-account -> seat-storage -> seat-order
END
- 访问 http://localhost:8082/order/create?userId=1&productId=1&count=10&money=100
- 因在account service中有睡眠方法,导致失败,seata全局回滚会生效
@Override
public void decrease(Long userId, BigDecimal money) {
LOGGER.info("------->扣减账户开始account中");
//模拟超时异常,全局事务回滚
try {
Thread.sleep(30*1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
accountMapper.decrease(userId,money);
LOGGER.info("------->扣减账户结束account中");
}
注意
如果使用mysql8 需要将seata server 中lib下的mysql-connector-java 换成 8的版本。
- 注释掉模拟异常,则会插入成功
以上如有错误请指正,谢谢~