影子叩

搜索
夜间模式◐

seata事务开发流程
· fall · 发布于 · 2020-07-26 · 372 次点击 · 复制地址

倔强青铜Ⅲ   fall  · 2020-07-26 16:54:25 · 显示全部楼层 · 阅读
今天小编手把手教大家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可以参考官网)
17650280-da7a11421d33fe00.png
修改file.conf

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

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

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

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



17650280-4186dbb8a57cca94.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

数据库相关配置

17650280-a264e3a082958ca8.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<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
17650280-257e23bea475095a.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接口。

17650280-83fc5a8b5fd66099.png

小编汇总一下下载网址,Seata官网:https://seata.io/zh-cn/docs/overview/what-is-seata.html,源码以及seata服务下载https://github.com/seata/seata/release,Seata官网Demo: https://github.com/seata/seata-samples,希望能够带给大家帮助。




免责声明:
影子论坛所发布的一切内容仅限用于学习和研究目的,请勿用于商业或者非法用途,否则一切后果由用户自负。
请支持正版得到更好的正版服务。如有侵权请邮件与我们联系处理。Mail To:swatxhim@outlook.com

回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表