Spring Cloud 中使用 Seata,使用 Feign 实现远程调用,使用 Spring JDBC 访问 MySQL 数据库
-
执行
sql/all_in_one.sql
-
下载最新版本的 Seata Sever
-
解压并启动 Seata server
unzip seata-server-xxx.zip
cd distribution
sh ./bin/seata-server.sh 8091 file
- 启动 AccountXA, OrderXA, StorageXA, BusinessXA 服务
- 无错误成功提交
curl http://127.0.0.1:8084/purchase
具体调用参数请结合 BusinessController 的代码。
数据初始化逻辑,参见 BusinessService#initData() 方法。
基于初始化数据,和默认的调用逻辑,purchase 将可以被成功调用 3 次。
每次账户余额扣减 3000,由最初的 10000 减少到 1000。
第 4 次调用,因为账户余额不足,purchase 调用将失败。相应的:库存、订单、账户都回滚。
只要切换数据源代理类型,该样例即可在 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;