阿里分布式事务框架seata入门demo- springcloud+seata+mybatis-plus实现分布式事务处理--目前最完整的入门Demo

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的地址

启动步骤

  1. 启动eureka
  2. 启动seata服务端
  3. 依次启动项目 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的版本。

  • 注释掉模拟异常,则会插入成功
    以上如有错误请指正,谢谢~

官方文档:

https://seata.io/zh-cn/index.html

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

猿道apeto

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值