簡介
github地址
spring-boot-starter-seata:https://github.com/itrickzhang/spring-boot-starter-seata
seata版本
server和client版本為0.4.1,Seata 一直在快速迭代在1.0 之前都有可能出現協議不兼容 盡量使用版本號一致
說明
目前提供的示例是針對使用dubbo的服務,那Spring Boot的項目如何集成fescar呢?
快速開始
使用案例
Business Service購買商品的業務邏輯。整個業務邏輯由3個微服務驅動:
- Storage service: 扣除給定商品的庫存量.
- Order service: 根據采購需求創建訂單.
- Account service: 借記用戶帳戶上的余額.
請求邏輯
fescar下載
下載地址:https://github.com/alibaba/fescar/releases
腳本
業務腳本
DROP TABLE IF EXISTS `storage_tbl`;
CREATE TABLE `storage_tbl` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`commodity_code` varchar(255) DEFAULT NULL,
`count` int(11) DEFAULT 0,
PRIMARY KEY (`id`),
UNIQUE KEY (`commodity_code`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
DROP TABLE IF EXISTS `order_tbl`;
CREATE TABLE `order_tbl` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`user_id` varchar(255) DEFAULT NULL,
`commodity_code` varchar(255) DEFAULT NULL,
`count` int(11) DEFAULT 0,
`money` int(11) DEFAULT 0,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
DROP TABLE IF EXISTS `account_tbl`;
CREATE TABLE `account_tbl` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`user_id` varchar(255) DEFAULT NULL,
`money` int(11) DEFAULT 0,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
事務腳本
-- 注意此處0.3.0+ 增加唯一索引 ux_undo_log
CREATE TABLE `undo_log` (
`id` bigint(20) NOT NULL AUTO_INCREMENT,
`branch_id` bigint(20) NOT NULL,
`xid` varchar(100) NOT NULL,
`rollback_info` longblob NOT NULL,
`log_status` int(11) NOT NULL,
`log_created` datetime NOT NULL,
`log_modified` datetime NOT NULL,
`ext` varchar(100) DEFAULT NULL,
PRIMARY KEY (`id`),
UNIQUE KEY `ux_undo_log` (`xid`,`branch_id`)
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8;
集成
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-seata</artifactId>
<version>${project.version}</version>
</dependency>
使用
使用注解@GlobalTransactional
@GlobalTransactional(timeoutMills = 300000, name = "spring-cloud-demo-tx")
@RequestMapping(value = "/fescar/feign", method = RequestMethod.GET, produces = "application/json")
public String feign() {
LOGGER.info("business Service Begin ... xid: " + RootContext.getXID());
String result = storageService.storage(COMMODITY_CODE, ORDER_COUNT);
if (!SUCCESS.equals(result)) {
throw new RuntimeException();
}
result = orderService.order(USER_ID, COMMODITY_CODE, ORDER_COUNT);
if (!SUCCESS.equals(result)) {
throw new RuntimeException();
}
return SUCCESS;
}
demo運行
spring-boot-starter-seata-sample
- Start AccountService
- Start StorageService
- Start OrderService
- Run BusinessService for demo test
運行結果
啟動demo
訪問demo
數據庫數據