seata事务开发流程

Seata事务

1. 下载seata 1.1.0

从网站上下载 https://github.com/seata/seata/releases。由于本人实在Linux下搭建的。所以下载的 seata-server1.1.0.tar.gz

项目引用

              
                 io.seata 
                 seata-all
                  1.1.0 
             

2. 进入加压后的seata文件夹下

进入conf 修改配置文件 file.conf registry.conf (nacos相关的配置文件可以不用管,nacos是用于nacos注册用的。本次只是用zk环境搭建,nacos可以参考官网)

image.png

修改file.conf

只需要修改如下配置即可:

store 下的mode 由原来的file 改为 db

db下 url user password 修改自己对应的数据库 (注意:改数据源连接是下面表格的数据源【global_table branch_table lock_table undo_log】,与业务数据源无关。


image.png

修改registet.conf

修改registet.conf registry 下 type 为 "zk" zk下的环境地址 配置zk的地址 (建议是zk集群,防止单个zk挂了,影响事务回滚)

image.png

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

数据库相关配置

image.png

写一个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 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

image.png
image.png

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接口。

image.png

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

你可能感兴趣的:(seata事务开发流程)