seata官网:http://seata.io/zh-cn/
前言
在当下微服务架构比较火热时,解决建源新一代微服务解决方案Spring Cloud Alibaba提供的分布开源分布式事务解决框架Seata无疑成为了我们在解决分布式事务时的首要之选,前面两篇文章分别介绍了常见的式事分布式解决方案和成熟的框架以及关于Seata概念的入门介绍,没有过分布式事务处理的解决建源小伙伴可以先有个大致的入门了解:
SpringCloud Alibaba微服务架构(十一)- 常见分布式事务解决方案及理论基础篇SpringCloud Alibaba微服务架构(十二)- 分布式事务解决框架之Seata概念入门篇那么在本篇Spring Cloud整合Seata之前,你必须要了解一下Spring Cloud Alibaba与Spring Boot、分布Spring Cloud之间的式事版本对应关系。
版本选择: Spring Cloud Alibaba与Spring Boot、解决建源Spring Cloud版本对应关系
一、分布版本要求
坑点1: 如果项目中使用了druid数据库连接池,式事引入的解决建源是SpringBoot的Starter依赖druid-spring-boot-starter,源码库那么需要把druid-spring-boot-starter依赖换成druid1.1.23,分布因为seata源码中引入的式事druid依赖跟druid-spring-boot-starter的自动装配类冲突了,冲突的解决建源情况下项目启动出现异常,异常如下:
二、分布整合Seata环境配置
1. 下载seata-server-1.2.0和seata-1.2.0源码
seate-server下载: https://seata.io/zh-cn/blog/download.html,式事下载我们需要使用的seata1.2压缩包。
seata-1.2.0源码下载: https://github.com/seata/seata/releases
在这里插入图片描述
2. 创建undo_log日志表
在seata1.2源码seata-1.2.0\script\client\at\db目录下有提供针对mysql、oracle、postgresql这三种数据库生成undo-log逆向日志回滚表的表创建脚本。
在你项目的参与全局事务的数据库中加入undo_log这张表。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` BIGINT(20) NOT NULL COMMENT branch transaction id, `xid` VARCHAR(100) 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(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 = utf8 COMMENT =AT transaction mode undo table;3.创建seata事务相关表
下载Seata1.2的源码后解压如上图,高防服务器目前支持mysql、oracle、postgresql这三种数据库,上述三种脚本是针对Seata的Sever端在协调处理分布式事务时所需要的3张表,提供了不同数据库的global_table表、branch_table表、lock_table表创建脚本,根据自身数据库执行对应的sql脚本执行即可。
这里以mysql为例,在你的mysql数据库中创建名为seata的库,并执行以下sql,将会生成三张表:
-- -------------------------------- The script used when storeMode is db -------------------------------- -- the table to store GlobalSession data CREATE TABLE IF NOT EXISTS `global_table` ( `xid` VARCHAR(128) NOT NULL, `transaction_id` BIGINT, `status` TINYINT NOT NULL, `application_id` VARCHAR(32), `transaction_service_group` VARCHAR(32), `transaction_name` VARCHAR(128), `timeout` INT, `begin_time` BIGINT, `application_data` VARCHAR(2000), `gmt_create` DATETIME, `gmt_modified` DATETIME, PRIMARY KEY (`xid`), KEY `idx_gmt_modified_status` (`gmt_modified`, `status`), KEY `idx_transaction_id` (`transaction_id`) ) ENGINE = InnoDB DEFAULT CHARSET = utf8; -- the table to store BranchSession data CREATE TABLE IF NOT EXISTS `branch_table` ( `branch_id` BIGINT NOT NULL, `xid` VARCHAR(128) NOT NULL, `transaction_id` BIGINT, `resource_group_id` VARCHAR(32), `resource_id` VARCHAR(256), `branch_type` VARCHAR(8), `status` TINYINT, `client_id` VARCHAR(64), `application_data` VARCHAR(2000), `gmt_create` DATETIME(6), `gmt_modified` DATETIME(6), PRIMARY KEY (`branch_id`), KEY `idx_xid` (`xid`) ) ENGINE = InnoDB DEFAULT CHARSET = utf8; -- the table to store lock data CREATE TABLE IF NOT EXISTS `lock_table` ( `row_key` VARCHAR(128) NOT NULL, `xid` VARCHAR(96), `transaction_id` BIGINT, `branch_id` BIGINT NOT NULL, `resource_id` VARCHAR(256), `table_name` VARCHAR(32), `pk` VARCHAR(36), `gmt_create` DATETIME, `gmt_modified` DATETIME, PRIMARY KEY (`row_key`), KEY `idx_branch_id` (`branch_id`) ) ENGINE = InnoDB DEFAULT CHARSET = utf8;4. 项目中引入seata依赖
4.1 如果微服务是SpringCloud
亿华云