Skip to content

Latest commit

 

History

History
93 lines (60 loc) · 2.17 KB

README.md

File metadata and controls

93 lines (60 loc) · 2.17 KB

Sample of Seata XA mode

Spring Cloud 中使用 Seata,使用 Feign 实现远程调用,使用 Spring JDBC 访问 MySQL 数据库

准备工作

  1. 执行sql/all_in_one.sql

  2. 下载最新版本的 Seata Sever

  3. 解压并启动 Seata server

unzip seata-server-xxx.zip

cd distribution
sh ./bin/seata-server.sh 8091 file
  1. 启动 AccountXA, OrderXA, StorageXA, BusinessXA 服务

测试

  • 无错误成功提交
curl http://127.0.0.1:8084/purchase

具体调用参数请结合 BusinessController 的代码。

数据初始化逻辑,参见 BusinessService#initData() 方法。

基于初始化数据,和默认的调用逻辑,purchase 将可以被成功调用 3 次。

每次账户余额扣减 3000,由最初的 10000 减少到 1000。

第 4 次调用,因为账户余额不足,purchase 调用将失败。相应的:库存、订单、账户都回滚。

XA 模式与 AT 模式

只要切换数据源代理类型,该样例即可在 XA 模式和 AT 模式之间切换。

DataSourceConfiguration

XA 模式使用 DataSourceProxyXA

public class DataSourceProxy {

    @Bean("dataSourceProxy")
    public DataSource dataSource(DruidDataSource druidDataSource) {
        // DataSourceProxyXA for XA mode
        return new DataSourceProxyXA(druidDataSource);
    }
}

AT 模式使用 DataSourceProxy

public class DataSourceProxy {

    @Bean("dataSourceProxy")
    public DataSource dataSource(DruidDataSource druidDataSource) {
        // DataSourceProxyXA for AT mode
        return new DataSourceProxy(druidDataSource);
    }
}

当然,AT 模式需要在数据库中建立 undo_log 表。(XA 模式是不需要这个表的)

CREATE TABLE `undo_log` (
  `id` bigint(20) NOT NULL AUTO_INCREMENT,
  `branch_id` bigint(20) NOT NULL,
  `xid` varchar(100) NOT NULL,
  `context` varchar(128) NOT NULL,
  `rollback_info` longblob NOT NULL,
  `log_status` int(11) NOT NULL,
  `log_created` datetime NOT NULL,
  `log_modified` datetime NOT NULL,
  PRIMARY KEY (`id`),
  UNIQUE KEY `ux_undo_log` (`xid`,`branch_id`)
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8;