当前位置: 首页 > news >正文

Seata入门系列【4】undo_log、global_table、branch_table、lock_table字段及作用详解

1 客户端

1.1 undo_log

在AT模式中,需要在参与全局事务的数据库中,添加一个undo_log表,建表语句如下:

SET NAMES utf8mb4;
SET FOREIGN_KEY_CHECKS = 0;-- ----------------------------
-- Table structure for undo_log
-- ----------------------------
DROP TABLE IF EXISTS `undo_log`;
CREATE TABLE `undo_log`  (`branch_id` bigint(20) NOT NULL COMMENT '分支事务ID',`xid` varchar(100) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '全局事务ID',`context` varchar(128) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '上下文',`rollback_info` longblob NOT NULL COMMENT '回滚信息',`log_status` int(11) NOT NULL COMMENT '状态,0正常,1全局已完成',`log_created` datetime(6) NOT NULL COMMENT '创建时间',`log_modified` datetime(6) NOT NULL COMMENT '修改时间',UNIQUE INDEX `ux_undo_log`(`xid`, `branch_id`) USING BTREE
) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_general_ci COMMENT = 'AT transaction mode undo table' ROW_FORMAT = Compact;SET FOREIGN_KEY_CHECKS = 1;

在全局事务的一阶段中,分支事务在获取到全局锁提交事务时,会释放本地锁和连接资源,并在undo_log表中插入一条数据。

比如在更新时,会插入这样一条数据:
在这里插入图片描述
各字段详细说明如下:

在这里插入图片描述
其中重要的是rollback_info,比如在更新一条数据时set money = 97,会查询修改之前该条数据的及修改后的数据状态。
在这里插入图片描述
在rollback_info中,该数据修改之前是98:
在这里插入图片描述
修改之前,该数据是97:
在这里插入图片描述
在第二阶段中,如果全局事务成功,会收到 TC 的分支提交请求,把请求放入一个异步任务的队列中,马上返回提交成功的结果给 TC。异步任务阶段的分支提交请求将异步和批量地删除相应 UNDO LOG 记录。

在第二阶段中,如果全局事务失败,会收到 TC 的分支回滚请求,开启一个本地事务,执行如下操作。

  • 通过 XID 和 Branch ID 查找到相应的 UNDO LOG 记录。

  • 数据校验:拿 UNDO LOG 中的后镜与当前数据进行比较,如果有不同,说明数据被当前全局事务之外的动作做了修改。这种情况,需要根据配置策略来做处理,详细的说明在另外的文档中介绍。

  • 根据 UNDO LOG 中的前镜像和业务 SQL 的相关信息生成并执行回滚的语句。

  • 提交本地事务。并把本地事务的执行结果(即分支事务回滚的结果)上报给 TC。

在这里插入图片描述

2 服务端

2.1 事务会话信存储模式

在服务端,需要存储事务会话信息,支持一下几种方式:

  • file本地文件(不支持HA)

  • db数据库(支持HA)

  • redis(支持HA)

其中本地文件方式,效率最高,但是不支持集群,而且出现问题时,是无法格式化的查看当前数据的,所以推荐使用数据库或者缓存的方式。

使用数据库模式时,需要创建以下三张表:
在这里插入图片描述

  • global_table:全局事务

  • branch_table:分支事务

  • lock_table:全局锁

2.2 global_table

global_table记录了全局事务的信息,建表语句如下:

SET NAMES utf8mb4;
SET FOREIGN_KEY_CHECKS = 0;-- ----------------------------
-- Table structure for global_table
-- ----------------------------
DROP TABLE IF EXISTS `global_table`;
CREATE TABLE `global_table`  (`xid` varchar(128) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '全局事务ID',`transaction_id` bigint(20) NULL DEFAULT NULL COMMENT '事务ID',`status` tinyint(4) NOT NULL COMMENT '状态',`application_id` varchar(32) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '应用ID',`transaction_service_group` varchar(32) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '事务分组名',`transaction_name` varchar(128) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '执行事务的方法',`timeout` int(11) NULL DEFAULT NULL COMMENT '超时时间',`begin_time` bigint(20) NULL DEFAULT NULL COMMENT '开始时间',`application_data` varchar(2000) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '应用数据',`gmt_create` datetime(0) NULL DEFAULT NULL COMMENT '创建时间',`gmt_modified` datetime(0) NULL DEFAULT NULL COMMENT '修改时间',PRIMARY KEY (`xid`) USING BTREE,INDEX `idx_gmt_modified_status`(`gmt_modified`, `status`) USING BTREE,INDEX `idx_transaction_id`(`transaction_id`) USING BTREE
) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Compact;SET FOREIGN_KEY_CHECKS = 1;

比如,当前应用demo001发起了一个全局事务,会在这个表中存入以下信息:
在这里插入图片描述

2.3 branch_table

branch_table记录了分支事务的信息,建表语句如下:

SET NAMES utf8mb4;
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 COMMENT '分支事务ID',`xid` varchar(128) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '全局事务ID',`transaction_id` bigint(20) NULL DEFAULT NULL COMMENT '全局事务ID,不带TC地址',`resource_group_id` varchar(32) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '资源分组ID',`resource_id` varchar(256) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '资源ID',`branch_type` varchar(8) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '事务模式,AT、XA等',`status` tinyint(4) NULL DEFAULT NULL COMMENT '状态',`client_id` varchar(64) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '客户端ID',`application_data` varchar(2000) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '应用数据',`gmt_create` datetime(6) NULL DEFAULT NULL COMMENT '创建时间',`gmt_modified` datetime(6) NULL DEFAULT NULL COMMENT '修改时间',PRIMARY KEY (`branch_id`) USING BTREE,INDEX `idx_xid`(`xid`) USING BTREE
) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Compact;-- ----------------------------
-- Records of branch_table
-- ----------------------------SET FOREIGN_KEY_CHECKS = 1;

当一个服务调用另一个服务进行全局事务时,可以看到,在该表中插入了当前两个服务分支事务的相关信息,其中重要的有ID、事务模式、客户端地址、数据库连接地址等。

INSERT INTO `branch_table` VALUES (99302990136565280, '192.168.58.1:8091:99302990136565278', 99302990136565278, NULL, 'jdbc:mysql://127.0.0.1:3306/db_account', 'AT', 0, 'demo001:192.168.58.1:2116', NULL, '2022-01-25 16:56:58.092953', '2022-01-25 16:56:58.092953');
INSERT INTO `branch_table` VALUES (99302990136565283, '192.168.58.1:8091:99302990136565278', 99302990136565278, NULL, 'jdbc:mysql://127.0.0.1:3306/db_order', 'AT', 0, 'demo002:192.168.58.1:2617', NULL, '2022-01-25 16:56:58.551257', '2022-01-25 16:56:58.551257');

2.4 lock_table

lock_table记录了锁相关的信息,建表语句如下:

SET NAMES utf8mb4;
SET FOREIGN_KEY_CHECKS = 0;-- ----------------------------
-- Table structure for lock_table
-- ----------------------------
DROP TABLE IF EXISTS `lock_table`;
CREATE TABLE `lock_table`  (`row_key` varchar(128) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '行键',`xid` varchar(96) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '全局事务ID',`transaction_id` bigint(20) NULL DEFAULT NULL COMMENT '全局事务ID,不带TC 地址',`branch_id` bigint(20) NOT NULL COMMENT '分支ID',`resource_id` varchar(256) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '资源ID',`table_name` varchar(32) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '表名',`pk` varchar(36) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '主键对应的值',`gmt_create` datetime(0) NULL DEFAULT NULL COMMENT '创建时间',`gmt_modified` datetime(0) NULL DEFAULT NULL COMMENT '修改时间',PRIMARY KEY (`row_key`) USING BTREE,INDEX `idx_branch_id`(`branch_id`) USING BTREE
) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Compact;SET FOREIGN_KEY_CHECKS = 1;

比如下图:

在这里插入图片描述
关于TC 端事务交互的详细流程,后续会分析

http://www.lryc.cn/news/192489.html

相关文章:

  • 虚幻引擎:数据表格的C++常用API
  • Java日期格式化(DateFormat类和SimpleDateFormat类)
  • centos 7 lamp owncloud
  • 屏幕亮度调节保护您的眼睛
  • CentOS Linux下CMake二进制文件安装并使用Visual Studio调试
  • ASP.net相关目录,相关配置文件和.后缀名解释
  • 一键批量转换,轻松将TS视频转为MP4视频,实现更广泛的播放和分享!
  • 【Redis】使用Java客户端操作Redis
  • BSPHP 未授权访问 信息泄露
  • Learning Sample Relationship for Exposure Correction 论文阅读笔记
  • Vue项目 -- 解决Eslint导致的console报错问题
  • uni-app 在已有的数据对象中动态添加更多的数据对象
  • 【LeetCode】17. 电话号码的字母组合
  • 使用 Apache Kafka 进行发布-订阅通信中的微服务
  • valarray 包含对象成员的类(cpp14章)
  • 2023双11笔记本电脑候选名单(截止2023.10.13的价格,双十一活动可能会更便宜一点)
  • Springcloud笔记(4)-客户端负载均衡Ribbon
  • MediaRecorder媒体录音机
  • 短视频如何批量添加水印
  • RT-Thread MQTT(学习)
  • Vue_Bug VUE-ELEMENT-ADMIN默认是英文模式
  • Spark中的Driver、Executor、Stage、TaskSet、DAGScheduler等介绍
  • docker的资源限制参数设置错误,导致的clickhouse性能瓶颈
  • Vue路由守卫有哪些,怎么设置,有哪些使用场景?
  • 云原生网关可观测性综合实践
  • vue-element-admin—登录页面添加自定义背景
  • 软设上午题-错题知识点一
  • 微信小程序(小程序入门)
  • 虹科分享 | 想买车无忧?AR为您带来全新体验!
  • easyUI重新渲染