Seata事务
1. 下载seata 1.1.0
从网站上下载 https://github.com/seata/seata/releases。由于本人实在Linux下搭建的。所以下载的 seata-server1.1.0.tar.gz
项目引用
<dependency>
<groupId>io.seata</groupId>
<artifactId>seata-all</artifactId>
<version> 1.1.0</version>
</dependency>
2. 进入加压后的seata文件夹下
进入conf 修改配置文件 file.conf registry.conf (nacos相关的配置文件可以不用管,nacos是用于nacos注册用的。本次只是用zk环境搭建,nacos可以参考官网)
修改file.conf
只需要修改如下配置即可:
store 下的mode 由原来的file 改为 db
db下 url user password 修改自己对应的数据库 (注意:改数据源连接是下面表格的数据源【global_table branch_table lock_table undo_log】,与业务数据源无关。
修改registet.conf
修改registet.conf registry 下 type 为 "zk" zk下的环境地址 配置zk的地址 (建议是zk集群,防止单个zk挂了,影响事务回滚)
3. 创建seata****需要的表格
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,
`ext` varchar(100) DEFAULT NULL,
PRIMARY KEY (`id`),
UNIQUE KEY `ux_undo_log` (`xid`,`branch_id`)
) ENGINE=InnoDB AUTO_INCREMENT=141596 DEFAULT CHARSET=utf8;
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`),
KEY `idx_xid` (`xid`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
CREATE TABLE `lock_table` (
`row_key` varchar(128) NOT NULL,
`xid` varchar(96) DEFAULT NULL,
`transaction_id` bigint(20) DEFAULT NULL,
`branch_id` bigint(20) NOT NULL,
`resource_id` varchar(256) DEFAULT NULL,
`table_name` varchar(32) DEFAULT NULL
`pk` varchar(36) DEFAULT NULL,
`gmt_create` datetime DEFAULT NULL,
`gmt_modified` datetime DEFAULT NULL,
PRIMARY KEY (`row_key`),
KEY `idx_branch_id` (`branch_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
CREATE TABLE `global_table` (
`xid` varchar(128) NOT NULL,
`transaction_id` bigint(20) DEFAULT NULL,
`status` tinyint(4) NOT NULL,
`application_id` varchar(32) DEFAULT NULL,
`transaction_service_group` varchar(32) 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`),
KEY `idx_gmt_modified_status` (`gmt_modified`,`status`),
KEY `idx_transaction_id` (`transaction_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
4. 下载配置参数文件,上传到zk
从这个地址 https://github.com/seata/seata/tree/1.1.0/script/config-center, 找到config.txt. 修改db配置
主要修改以下内容:
store.mode=db
数据库相关配置
写一个main方法 将数据上传到zk服务上
public class ZkDataInit {
private static volatile ZkClient zkClient;
public static void main(String[] args) {
if (zkClient == null) {
zkClient = new ZkClient("172.0.0.0:2181,172.0.0.0:2182,172.0.0.0:2183", 6000, 3000);
}
if (!zkClient.exists("/seata")) {
zkClient.createPersistent("/seata", true);
}
//获取key对应的value值
Properties properties = new Properties();
// 使用ClassLoader加载properties配置文件生成对应的输入流
// 使用properties对象加载输入流
try {
File file = ResourceUtils.getFile("classpath:zk-config.properties");
InputStream in = new FileInputStream(file);
properties.load(in);
Set<Object> keys = properties.keySet();//返回属性key的集合
for (Object key : keys) {
boolean b = putConfig(key.toString(), properties.get(key).toString());
System.out.print("结果:"+b);
}
} catch (IOException e) {
e.printStackTrace();
}
}
/**
*
* @param dataId
* @param content
* @return
*/
public static boolean putConfig(final String dataId, final String content) {
Boolean flag = false;
String path = "/seata/" + dataId;
if (!zkClient.exists(path)) {
zkClient.create(path, content, CreateMode.PERSISTENT);
flag = true;
} else {
zkClient.writeData(path, content);
flag = true;
}
return flag;
}
}
5. 启动seata****服务
进入seata/bin目录: sh seata-server.sh
如果要配置seata服务集群,只需要复制第3步。将seata服务部署在另外一台机器上即可
6. 项目中部署代码
在整个项目中添加 file.conf registry.conf 这两个文件在第一步下载的seata文件 在 seata/conf 目录下
比如这个项目 business 调用方 order订单服务 storage库存服务。 均需要添加file.conf registry.conf
7. 在每个项目中添加
需要自动注入
@Configuration
public class SeataAutoConfig {
/**
* init global transaction scanner
*
* **@Return:** GlobalTransactionScanner
*/*
@Bean
public GlobalTransactionScanner globalTransactionScanner(){
return new GlobalTransactionScanner(**"dubbo-gts-seata-example"**, **"my_test_tx_group"**);
}
}
8 在事务发起方,只需要加上注解。@GlobalTransactional****注解即可,这就开启了整个链路事务控制。
比如: business为调用方, 进行减库存操作,和创建订单操作。 减库存接口和创建订单接口就是普通的dubbo接口。
Seata官网:https://seata.io/zh-cn/docs/overview/what-is-seata.html
源码以及seata服务下载:https://github.com/seata/seata/releases
Seata官网Demo: https://github.com/seata/seata-samples
参考:https://www.ctolib.com/lidong1665-springboot-dubbo-seata-zk.html
https://blog.csdn.net/Yang_Hai_Long_1_2/article/details/103702656