分布式事務框架 Seata 入門案例( 二 )

如果采用AT模式,那么每個業務數據庫還需建一個undo_log表
-- for AT mode you must to init this sql for you business database. the seata server not need it.CREATE TABLE IF NOT EXISTS `undo_log`(`branch_id`BIGINTNOT NULL COMMENT 'branch transaction id',`xid`VARCHAR(128) NOT NULL COMMENT 'global transaction id',`context`VARCHAR(128) NOT NULL COMMENT 'undo_log context,such as serialization',`rollback_info` LONGBLOBNOT NULL COMMENT 'rollback info',`log_status`INT(11)NOT NULL COMMENT '0:normal status,1:defense status',`log_created`DATETIME(6)NOT NULL COMMENT 'create datetime',`log_modified`DATETIME(6)NOT NULL COMMENT 'modify datetime',UNIQUE KEY `ux_undo_log` (`xid`, `branch_id`)) ENGINE = InnoDB AUTO_INCREMENT = 1 DEFAULT CHARSET = utf8mb4 COMMENT ='AT transaction mode undo table';

分布式事務框架 Seata 入門案例

文章插圖
啟動
  • 源碼啟動: 執行ServerApplication.java的main方法
  • 命令啟動: seata-server.sh -h 127.0.0.1 -p 8091 -m db
    • -h: 注冊到注冊中心的ip
    • -p: Server rpc 監聽端口
    • -m: 全局事務會話信息存儲模式,file、db、redis,優先讀取啟動參數
    • -n: Server node,多個Server時,需區分各自節點,用于生成不同區間的transactionId,以免沖突
    • -e: 多環境配置參考 http://seata.io/en-us/docs/ops/multi-configuration-isolation.html?
2.  業務系統集成 Seata Client
步驟一:添加seata依賴(建議單?。?
  • 依賴seata-all
  • 依賴seata-spring-boot-starter , 支持yml、properties配置(.conf可刪除),內部已依賴seata-all
  • 依賴spring-cloud-alibaba-seata , 內部集成了seata,并實現了xid傳遞
步驟二:undo_log建表、配置參數(僅AT模式)
https://seata.io/zh-cn/docs/user/configurations.html
步驟三:數據源代理(不支持自動和手動配置并存)
1、如果使用seata-all
自動配置由注解@EnableAutoDataSourceProxy開啟,并可選擇jdk proxy或者cglib proxy 。
如果采用XA模式 , @EnableAutoDataSourceProxy(dataSourceProxyMode = "XA")
手動配置參考如下:
@Primary@Bean("dataSource")public DataSource dataSource(DataSource druidDataSource) {//AT 代理 二選一return new DataSourceProxy(druidDataSource);//XA 代理return new DataSourceProxyXA(druidDataSource)}2、如果使用seata-starter
默認就開啟了自動代理數據源,無需額外配置
如果使用自動代理數據源時,如果使用XA模式還需要調整配置文件application.yml
seata:data-source-proxy-mode: XA如果想要關閉seata-spring-boot-starter的數據源自動代理 , 可調整配置文件application.yml
seata:enable-auto-data-source-proxy: false步驟四:初始化GlobalTransactionScanner
自動,引入seata-spring-boot-starter、spring-cloud-starter-alibaba-seata等jar即可
手動
@Beanpublic GlobalTransactionScanner globalTransactionScanner() {String applicationName = this.applicationContext.getEnvironment().getProperty("spring.application.name");String txServiceGroup = this.seataProperties.getTxServiceGroup();if (StringUtils.isEmpty(txServiceGroup)) {txServiceGroup = applicationName + "-fescar-service-group";this.seataProperties.setTxServiceGroup(txServiceGroup);}return new GlobalTransactionScanner(applicationName, txServiceGroup);}步驟五:業務使用
只需在業務方法上加上@GlobalTransactional 注解即可
3.  示例代碼
此處用官網的那個案例,調用關系如圖:
分布式事務框架 Seata 入門案例

文章插圖
首先,建庫建表,腳本如下:
SQL腳本CREATE DATABASE `account`;USE `account`;DROP TABLE IF EXISTS `t_account`;CREATE TABLE `t_account` (`id` int NOT NULL AUTO_INCREMENT,`user_id` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci DEFAULT NULL,`amount` double(14,2) DEFAULT '0.00',PRIMARY KEY (`id`)) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;INSERT INTO `t_account` VALUES (1,'1',79.90);DROP TABLE IF EXISTS `undo_log`;CREATE TABLE `undo_log` (`branch_id` bigint NOT NULL COMMENT 'branch transaction id',`xid` varchar(128) NOT NULL COMMENT 'global transaction id',`context` varchar(128) NOT NULL COMMENT 'undo_log context,such as serialization',`rollback_info` longblob NOT NULL COMMENT 'rollback info',`log_status` int NOT NULL COMMENT '0:normal status,1:defense status',`log_created` datetime(6) NOT NULL COMMENT 'create datetime',`log_modified` datetime(6) NOT NULL COMMENT 'modify datetime',UNIQUE KEY `ux_undo_log` (`xid`,`branch_id`)) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci COMMENT='AT transaction mode undo table';CREATE DATABASE `order`;USE `order`;DROP TABLE IF EXISTS `t_order`;CREATE TABLE `t_order` (`id` int NOT NULL AUTO_INCREMENT,`order_no` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci DEFAULT NULL,`user_id` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci DEFAULT NULL,`commodity_code` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci DEFAULT NULL,`count` int DEFAULT '0',`amount` double(14,2) DEFAULT '0.00',PRIMARY KEY (`id`)) ENGINE=InnoDB AUTO_INCREMENT=21 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;DROP TABLE IF EXISTS `undo_log`;CREATE TABLE `undo_log` (`branch_id` bigint NOT NULL COMMENT 'branch transaction id',`xid` varchar(128) NOT NULL COMMENT 'global transaction id',`context` varchar(128) NOT NULL COMMENT 'undo_log context,such as serialization',`rollback_info` longblob NOT NULL COMMENT 'rollback info',`log_status` int NOT NULL COMMENT '0:normal status,1:defense status',`log_created` datetime(6) NOT NULL COMMENT 'create datetime',`log_modified` datetime(6) NOT NULL COMMENT 'modify datetime',UNIQUE KEY `ux_undo_log` (`xid`,`branch_id`)) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci COMMENT='AT transaction mode undo table';CREATE DATABASE `stock`;USE `stock`;DROP TABLE IF EXISTS `t_stock`;CREATE TABLE `t_stock` (`id` int NOT NULL AUTO_INCREMENT,`commodity_code` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci DEFAULT NULL,`name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci DEFAULT NULL,`count` int DEFAULT '0',PRIMARY KEY (`id`),UNIQUE KEY `commodity_code` (`commodity_code`)) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;INSERT INTO `t_stock` VALUES (1,'A001','立白洗潔精',7);DROP TABLE IF EXISTS `undo_log`;CREATE TABLE `undo_log` (`branch_id` bigint NOT NULL COMMENT 'branch transaction id',`xid` varchar(128) NOT NULL COMMENT 'global transaction id',`context` varchar(128) NOT NULL COMMENT 'undo_log context,such as serialization',`rollback_info` longblob NOT NULL COMMENT 'rollback info',`log_status` int NOT NULL COMMENT '0:normal status,1:defense status',`log_created` datetime(6) NOT NULL COMMENT 'create datetime',`log_modified` datetime(6) NOT NULL COMMENT 'modify datetime',UNIQUE KEY `ux_undo_log` (`xid`,`branch_id`)) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci COMMENT='AT transaction mode undo table';

推薦閱讀