seata事务开发流程

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可以参考官网)

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<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

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

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,185评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,445评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 157,684评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,564评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,681评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,874评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,025评论 3 408
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,761评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,217评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,545评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,694评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,351评论 4 332
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,988评论 3 315
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,778评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,007评论 1 266
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,427评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,580评论 2 349