Spring Cloud Alibaba Seata

/ springcloud / 2 条评论 / 1594浏览

Spring Cloud Alibaba Seata

一次业务操作需要跨多个数据源或者跨多个系统进行远程调用,就会产生分布式事务问题

官网术语

image

安装

  # service指定分组名称
  vgroup_mapping.my_test_tx_group = "java_tx_group"
  
  # store下的配置修改为db配置
  mode = "db"
  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.jdbc.Driver"
      url = "jdbc:mysql://127.0.0.1:3306/seata"
      user = "root"
      password = "123456"
      min-conn = 1
      max-conn = 3
      global.table = "global_table"
      branch.table = "branch_table"
      lock-table = "lock_table"
      query-limit = 100
    }  
seata数据库所需表:
[server](https://github.com/seata/seata/tree/develop/script/server)

业务数据库所需表:
[client](https://github.com/seata/seata/tree/develop/script/client) 
  type = "nacos"

  nacos {
    serverAddr = "localhost:8848"
    namespace = ""
    cluster = "default"
  }

项目中使用

参考seata-order-service2001、seata-storage-service2002、seata-account-service2003三个服务

    @Override
    @GlobalTransactional(name = "java-create-order",rollbackFor = Exception.class)
    public void create(Order order){
        log.info("----->开始新建订单");
        //新建订单
        orderDao.create(order);

        //扣减库存
        log.info("----->订单微服务开始调用库存,做扣减Count");
        storageService.decrease(order.getProductId(),order.getCount());
        log.info("----->订单微服务开始调用库存,做扣减end");

        //扣减账户
        log.info("----->订单微服务开始调用账户,做扣减Money");
        accountService.decrease(order.getUserId(),order.getMoney());
        log.info("----->订单微服务开始调用账户,做扣减end");

        //修改订单状态,从零到1代表已经完成
        log.info("----->修改订单状态开始");
        orderDao.update(order.getUserId(),0);
        log.info("----->修改订单状态结束");

        log.info("----->下订单结束了");
    }
    @Override
    public void decrease(Long userId, BigDecimal money) {
        log.info("------->account-service中扣减账户余额开始");
        //模拟超时异常20s,全局事务回滚,OpenFeign默认超时时间是1s
        try {
            TimeUnit.SECONDS.sleep(20);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        accountDao.decrease(userId, money);
        log.info("------->account-service中扣减账户余额结束");
    }