seata 运行原理
seata 运行原理图
图画的有点大,可以点击放大查看
seata 运行原理简述
1.服务a 调用服务b 时,会根据seata全局事务注释创建一个xid 2.然后每个服务都会拦截本次事务的connection 并且生成反向的sql,然后用xid 做关联主键插入反向sql,发送到seata server 并插入到数据库 3.如果本次事务的所有服务都执行没问题,则tm 确认完毕后会删除本次事务生成的所有反向sql 4.如果本次事务涉及的某个服务方法执行报错,则tm 通知所有服务端报错信息,以及执行对应数据库的反向sql恢复数据 5.都结束之后本次事务完毕
代码版seata server集成
为什么要集成seata server 代码版
seata server 一般用法是直接用官网编译好的包,之所以选择用代码版本有以下几个有点 1.方便统一风格管理 2.方便调试以及查看源码 3.可以针对自己需求进行定制化修改 4.CI/CD时可以按照自己项目需求进行编译与集成
创建seata数据库和表,库名自定义我这里叫mini-cloud-seata
/* Source Database : mini_cloud_seata Target Server Type : MYSQL Target Server Version : 50730 File Encoding : 65001 */ SET FOREIGN_KEY_CHECKS=0; -- ---------------------------- -- Table structure for branch_table -- ---------------------------- DROP TABLE IF EXISTS `branch_table`; CREATE TABLE `branch_table` ( `branch_id` bigint(20) NOT NULL, `xid` varchar(128) NOT NULL, `transaction_id` bigint(20) DEFAULT NULL, `resource_group_id` varchar(32) DEFAULT NULL, `resource_id` varchar(256) DEFAULT NULL, `lock_key` varchar(128) DEFAULT NULL, `branch_type` varchar(8) DEFAULT NULL, `status` tinyint(4) DEFAULT NULL, `client_id` varchar(64) DEFAULT NULL, `application_data` varchar(2000) DEFAULT NULL, `gmt_create` datetime DEFAULT NULL, `gmt_modified` datetime DEFAULT NULL, PRIMARY KEY (`branch_id`) USING BTREE, KEY `idx_xid` (`xid`) USING BTREE ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 ROW_FORMAT=DYNAMIC; -- ---------------------------- -- Table structure for global_table -- ---------------------------- DROP TABLE IF EXISTS `global_table`; CREATE TABLE `global_table` ( `xid` varchar(128) NOT NULL, `transaction_id` bigint(20) DEFAULT NULL, `status` tinyint(4) NOT NULL, `application_id` varchar(64) DEFAULT NULL, `transaction_service_group` varchar(64) DEFAULT NULL, `transaction_name` varchar(64) DEFAULT NULL, `timeout` int(11) DEFAULT NULL, `begin_time` bigint(20) DEFAULT NULL, `application_data` varchar(2000) DEFAULT NULL, `gmt_create` datetime DEFAULT NULL, `gmt_modified` datetime DEFAULT NULL, PRIMARY KEY (`xid`) USING BTREE, KEY `idx_gmt_modified_status` (`gmt_modified`,`status`) USING BTREE, KEY `idx_transaction_id` (`transaction_id`) USING BTREE ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 ROW_FORMAT=DYNAMIC; -- ---------------------------- -- Table structure for lock_table -- ---------------------------- DROP TABLE IF EXISTS `lock_table`; CREATE TABLE `lock_table` ( `row_key` varchar(128) NOT NULL, `xid` varchar(96) DEFAULT NULL, `transaction_id` mediumtext, `branch_id` mediumtext, `resource_id` varchar(256) DEFAULT NULL, `table_name` varchar(32) DEFAULT NULL, `pk` varchar(32) DEFAULT NULL, `gmt_create` datetime DEFAULT NULL, `gmt_modified` datetime DEFAULT NULL, PRIMARY KEY (`row_key`) USING BTREE ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 ROW_FORMAT=DYNAMIC;
idea 导入源码并修改配置
下载解压后用idea导入源码,修改以下配置文件(没有的配置文件可以手动添加上)
file.conf
db { ## the implement of javax.sql.DataSource, such as DruidDataSource(druid)/BasicDataSource(dbcp)/HikariDataSource(hikari) etc. datasource = "druid" ## mysql/oracle/postgresql/h2/oceanbase etc. dbType = "mysql" driverClassName = "com.mysql.jdbc.Driver" ##seata-mysql 记得在hosts 配置好对应的数据库ip url = "jdbc:mysql://seata-mysql:3306/mini_cloud_seata" user = "root" password = "root" minConn = 5 maxConn = 100 globalTable = "global_table" branchTable = "branch_table" lockTable = "lock_table" queryLimit = 100 maxWait = 5000 }
registry.conf
nacos { application = "seata-server" ## 我是本地启动的nacos,大家可以改成自己的实际 nacos 地址 serverAddr = "127.0.0.1:8848" group = "SEATA_GROUP" namespace = "" cluster = "default" username = "" password = "" }
启动校验是否成功
启动类
启动成功