Seata 2.x 系列【10】回滚日志表 undo_log

news2024/11/15 10:18:49

有道无术,术尚可求,有术无道,止于术。

本系列Seata 版本 2.0.0

本系列Spring Boot 版本 3.2.0

本系列Spring Cloud 版本 2023.0.0

源码地址:https://gitee.com/pearl-organization/study-seata-demo

文章目录

    • 1. 概述
    • 2. 表语句
    • 3. 配置项
    • 4. 回滚信息
      • 4.1 内容
      • 4.2 序列化/反序列化
      • 4.3 压缩

1. 概述

AT模式中,需要在参与全局事务的数据库中,添加一个undo_log表,类似于Mysql数据库中的undo log事务回滚日志表,在事务没提交之前,记录分支事务更新前的数据到日志表中,当全局事务需要回滚时,TC发出回滚命令,RM收到后使用undo log进行回退,并删除日志。

2. 表语句

undo_log建表语句如下:

-- seata_account.undo_log definition

CREATE TABLE `undo_log` (
  `id` bigint NOT NULL AUTO_INCREMENT COMMENT '主键ID',
  `branch_id` bigint NOT NULL COMMENT '分支事务ID',
  `xid` varchar(100) CHARACTER SET utf8mb3 COLLATE utf8_general_ci NOT NULL COMMENT '全局事务唯一标识',
  `context` varchar(128) CHARACTER SET utf8mb3 COLLATE utf8_general_ci NOT NULL COMMENT '上下文',
  `rollback_info` longblob NOT NULL COMMENT '回滚信息',
  `log_status` int NOT NULL COMMENT '状态,0正常,1全局已完成(防悬挂)',
  `log_created` datetime NOT NULL COMMENT '创建时间',
  `log_modified` datetime NOT NULL COMMENT '修改时间',
  PRIMARY KEY (`id`),
  UNIQUE KEY `ux_undo_log` (`xid`,`branch_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb3 COMMENT='AT模式回滚日志表';

各字段详细说明如下:

字段名说明
id主键ID
branch_id分支事务ID,比如:99302990136558270
xid全局事务唯一标识,比如:192.168.58.1:8091:99302990136558268Seata 服务端地址+全局事务ID
context回滚信息序列化和压缩格式,serializer=fastjson&compressorType=NONE,表示使用fastjson序列化,没有采用压缩
rollback_info回滚信息
log_status日志状态,0正常,1全局已完成 (防悬挂)
log_created创建时间
log_modified修改时间

3. 配置项

Server端关于undo log的配置项:

server.undo.logSaveDays=7
server.undo.logDeletePeriod=86400000

配置说明:

配置项描述备注
server.undo.logSaveDays保留天数默认 7 天,清理log_status=1和未正常清理的记录
server.undo.logDeletePeriod清理线程间隔时间默认 8640000024小时),单位毫秒

Client端关于undo log的配置项:

client.undo.dataValidation=true
client.undo.logSerialization=jackson
client.undo.onlyCareUpdateColumns=true
server.undo.logSaveDays=7
server.undo.logDeletePeriod=86400000
client.undo.logTable=undo_log
client.undo.compress.enable=true
client.undo.compress.type=zip
client.undo.compress.threshold=64k

配置说明:

配置项描述备注版本说明
client.undo.dataValidation二阶段回滚镜像校验默认 true 开启false 关闭
client.undo.logSerialization序列化方式默认 jackson
client.undo.logTable自定义表名默认 undo_log
client.undo.onlyCareUpdateColumns只生成被更新列的镜像默认 true
client.undo.compress.enable压缩开关默认 true1.4.1 版本新增
client.undo.compress.type压缩算法 默认 zip,可选 NONE(不压缩)、GZIPZIPSEVENZBZIP2LZ4DEFLATERZSTD1.4.1 版本新增
client.undo.compress.threshold压缩阈值默认值 64k,压缩开关开启且 undo log 大小超过阈值时才进行压缩1.4.1 版本新增

4. 回滚信息

4.1 内容

RM执行分支事务后,开始构建回滚日志,其中最重要的就是回滚信息rollback_info字段,记录了数据修改前后镜像

例如调用库存服务扣减时,undo_log表生成的rollback_info信息如下:
在这里插入图片描述
rollback_info信息对应的类为BranchUndoLog,经过序列化后,在数据库以longblob格式存储:

public class BranchUndoLog implements Serializable {
    private static final long serialVersionUID = -101750721633603671L;
    // 全局事务标识
    private String xid;
    // 分支事务ID
    private long branchId;
    // undo log 信息
    private List<SQLUndoLog> sqlUndoLogs;
}

undo log 信息对应的类为SQLUndoLog

public class SQLUndoLog implements Serializable {
    private static final long serialVersionUID = -4160065043902060730L;
    // SQL 类型
    private SQLType sqlType;
    // 表名
    private String tableName;
    // 操作前数据镜像
    private TableRecords beforeImage;
    // 操作后数据镜像
    private TableRecords afterImage;
}

前置镜像中,会记录该条数据被修改前的主键ID、被修改的字段及值:
在这里插入图片描述
后置镜像中,会记录该条数据被修改后的主键ID、被修改的字段及值:
在这里插入图片描述
当全局事务需要回滚时,RM会根据事务ID查询到回滚信息(反序列化),根据前后镜像将数据还原到被修改前的状态,然后进行日志删除和事务提交,并把本地事务的执行结果(即分支事务回滚的结果)上报给 TC

注意: 详细的执行流程,会在后续源码分析篇介绍。

4.2 序列化/反序列化

回滚信息在进行存储、查询时,涉及到序列化反序列化Seata 提供了UndoLogParser 接口处理回滚日志的序列化和反序列化:

public interface UndoLogParser {
	// 序列化类型名称,比如fastjson
    String getName();
	// 获取默认的内容=》{}
    byte[] getDefaultContent();
	// 序列化BranchUndoLog 对象 
    byte[] encode(BranchUndoLog var1);
	// 反序列化BranchUndoLog 对象 
    BranchUndoLog decode(byte[] var1);
}

UndoLogParser 接口的实现类就对应了Seata 提供的序列化方式:
在这里插入图片描述
简要说明:

  • FastjsonUndoLogParserFastjson
  • JacksonUndoLogParserJackson
  • KryoUndoLogParserKryo
  • ProtostuffUndoLogParserProtostuff

推荐使用默认的jackson即可,其他方式可能还需要额外引入对应的包,并通过以下配置项进行修改:

client.undo.logSerialization=jackson
client.undo.logSerialization=fastjson
client.undo.logSerialization=kryo
client.undo.logSerialization=protostuff

4.3 压缩

在上面我们只修改了库存表的一个存库值,回滚信息的内容已经很多,如果是批量插入、更新、删除等操作,其影响的行数可能会比较多,将会拼接成一个大的字段插入到数据库中,会带来以下问题:

  • 超出数据库单次操作的最大写入限制,比如MySQLmax_allowed_package参数
  • 较大的数据量带来的网络IO和数据库磁盘IO开销比较大

Seata 1.4.1 版在框架层面提供了undo log数据压缩功能,通进一步提高Seata在处理数据量较大的时候的性能,同时也提供了对应的开关和相对合理的默认值,既方便用户进行开箱即用,也方便用户根据实际需求进行一定的调整,使得对应的功能更适合实际使用场景。

实现思路如下图所示:
在这里插入图片描述
默认配置项如下说示:

# 是否开启undo_log压缩,默认为true
seata.client.undo.compress.enable=true
# 压缩器类型,默认为zip,一般建议都是zip
seata.client.undo.compress.type=zip
# 启动压缩的阈值,默认为64k
seata.client.undo.compress.threshold=64k

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1516124.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

[抽象]工厂模式([Abstract] Factory)——创建型模式

[抽象]工厂模式——创建型模式 什么是抽象工厂&#xff1f; 抽象工厂模式是一种创建型设计模式&#xff0c;让你能够保证在客户端程序中创建一系列有依赖的对象组时&#xff0c;无需关心这些对象的类型。 具体来说&#xff1a; 对象的创建与使用分离&#xff1a; 抽象工厂模…

手把手带你实现大模型检索增强生成RAG(一)——数据清洗准备

首先&#xff0c;需要整理一大堆可以用来检索的文本数据&#xff0c;这些数据可以是网页、论文、报告、电影脚本、电视剧脚本等等。这些数据可以是原始的文本数据&#xff0c;也可以是经过清洗、处理过的文本数据。 作为IT打工仔&#xff0c;我从二道贩子处购入一本软考秘籍。…

【Numpy】基础学习:一文了解np.expand_dims的作用、用法

【Numpy】基础学习&#xff1a;一文了解np.expand_dims的作用、用法 &#x1f308; 个人主页&#xff1a;高斯小哥 &#x1f525; 高质量专栏&#xff1a;Matplotlib之旅&#xff1a;零基础精通数据可视化、Python基础【高质量合集】、PyTorch零基础入门教程&#x1f448; 希望…

电脑闹钟软件哪个好用,电脑闹钟软件推荐助你高效工作

在这个快节奏的社会中&#xff0c;时间对于每个人来说都是宝贵的。如何有效利用时间&#xff0c;提高工作效率成为了现代人所面临的重要问题之一。而电脑闹钟软件作为一款实用的工作助手&#xff0c;可以提醒我们按时完成任务&#xff0c;规划好时间&#xff0c;使我们更加高效…

STC89C52单片机 启动!!!(一)

跑马灯实现 直接上代码 #include<regx52.h> sbit D1P2^0; sbit D2P2^1; sbit D3P2^2; sbit D4P2^3; sbit D5P2^4; sbit D6P2^5; sbit D7P2^6; sbit D8P2^7; void delay(int num){while(num--){} } void led_running(){//从第1盏灯到第8盏灯依次点亮D10;delay(40000);D2…

解决方案:淘宝NPM镜像证书到期导致的安装Node失败

博主猫头虎的技术世界 &#x1f31f; 欢迎来到猫头虎的博客 — 探索技术的无限可能&#xff01; 专栏链接&#xff1a; &#x1f517; 精选专栏&#xff1a; 《面试题大全》 — 面试准备的宝典&#xff01;《IDEA开发秘籍》 — 提升你的IDEA技能&#xff01;《100天精通鸿蒙》 …

宏集案例 | 风电滑动轴承齿轮箱内多点温度采集与处理

前言 风力发电机组中的滑动轴承齿轮箱作为关键的传动装置&#xff0c;承担着将风能转化为电能的重要角色。齿轮箱内多点温度的实时监测可以有效地预防设备故障和性能下降。实时监测齿轮箱内多点温度可以有效地预防设备故障和性能下降。 为了确保风力发电机组的安全稳定运行&a…

HarmonyOS NEXT应用开发之深色模式适配

介绍 本示例介绍在开发应用以适应深色模式时&#xff0c;对于深色和浅色模式的适配方案&#xff0c;采取了多种策略如下&#xff1a; 固定属性适配&#xff1a;对于部分组件的颜色属性&#xff0c;如背景色或字体颜色&#xff0c;若保持不变&#xff0c;可直接设定固定色值或…

数组名结合指针的面试题的讲解

笔试题 第一题&#xff1a; 已知条件&#xff1a; 已知p为结构体指针变量&#xff0c;值为0x100000&#xff0c;并且结构体的大小为20字节&#xff0c;并且打印格式均为%p&#xff0c;%p不会在乎正负数&#xff0c;它会以补码的形式直接打印&#xff0c;0x1为16进制的1。 第一问…

[C++核心编程](九):类和对象——多态**

目录 多态的分类 多态的原理剖析 多态的优点 纯虚函数和抽象类 虚析构和纯虚析构 多态是C面向对象三大特性之一 多态的分类 静态多态 -函数重载和运算符重载属于静态多态&#xff0c;复用函数名 -函数地址早绑定-编译阶段确定函数地址 动态多态 -派生类和虚函数实现运行…

Docker达梦安装

拷贝安装包到 /soft目录下&#xff0c;执行以下命令导入安装包&#xff1a; docker load -i dm8_20230808_rev197096_x86_rh6_64_single.tar 结果显示如下&#xff1a; 启动容器 镜像导入后&#xff0c;使用 docker run 启动容器&#xff0c;启动命令如下&#xff1a; doc…

如何使用vue定义组件之——子组件调用父组件数据

1.定义父子模板template <div class"container"><my-father></my-father><my-father></my-father><my-father></my-father><!-- 此处无法调用子组件&#xff0c;子组件必须依赖于父组件进行展示 --><!-- <my-…

基于电鳗觅食优化算法(Electric eel foraging optimization,EEFO)的无人机三维路径规划(提供MATLAB代码)

一、无人机路径规划模型介绍 无人机三维路径规划是指在三维空间中为无人机规划一条合理的飞行路径&#xff0c;使其能够安全、高效地完成任务。路径规划是无人机自主飞行的关键技术之一&#xff0c;它可以通过算法和模型来确定无人机的航迹&#xff0c;以避开障碍物、优化飞行…

UE5 UMG拖拽旋转

需要一个区域接收ButtonDown再在ButtonUp取消作用再在ButtonMove改变值最后tick或者ButtonMove去做动作

Python小设计

1. 五个PPT上的界面打印【print、input函数】 &#xff08;1&#xff09;英雄商城登陆界面 print(英雄联盟商城登录界面 ~ * ~ * ~ * ~ * ~ * ~ * ~ * ~ * ~ * ~ * ~ * ~ * ~ * ~ * ~1. 用户登录2. 新用户注册3. 退出系统 ~ * ~ * ~ * ~ * ~ * ~ * ~ * ~ * ~ * ~ * ~ * ~ * ~…

Day30:安全开发-JS应用NodeJS指南原型链污染Express框架功能实现审计

目录 环境搭建-NodeJS-解析安装&库安装 功能实现-NodeJS-数据库&文件&执行 安全问题-NodeJS-注入&RCE&原型链 案例分析-NodeJS-CTF题目&源码审计 开发指南-NodeJS-安全SecGuide项目 思维导图 JS知识点&#xff1a; 功能&#xff1a;登录验证&…

EI期刊复现:面向配电网韧性提升的移动储能预布局与动态调度策略程序代码!

适用平台&#xff1a;MatlabYalmipCplex/Gurobi/Mosek 程序提出一种多源协同的两阶段配电网韧性提升策略。在灾前考虑光伏出力不确定性与网络重构&#xff0c;以移动储能配置成本与负荷削减风险成本最小为目标对储能的配置数量与位置进行预布局&#xff1b;在灾后通过多源协同…

保护IP地址安全:维护网络安全

在今天的数字化时代&#xff0c;IP地址是互联网通信的基础&#xff0c;也是网络安全的重要组成部分。保护IP地址安全至关重要&#xff0c;因为恶意攻击者可能利用IP地址进行网络入侵、数据泄露、服务拒绝等攻击。因此&#xff0c;制定有效的保护措施&#xff0c;维护IP地址的安…

深入理解指针——C语言

目录 1. 内存和地址 2. 指针变量和地址 3. 指针变量类型的意义 4. const修饰指针 5. 指针运算 6. 野指针 7. assert断言 8. 指针的使用和传址调用 9. 数组名的理解 10. 使用指针访问数组 11. 一维数组传参的本质 12. 冒泡排序 13. 二级指针 14. 指针数组 15. 指…

英语同传翻译,北京本地同声传译收费价格多少

同声传译是一项高度专业化的服务&#xff0c;广泛应用于国际会议、商务洽谈、法庭审判等场合。由于其对译员的语言能力、专业知识以及应变能力的极高要求&#xff0c;使得同声传译的收费价格也相对较高。那么&#xff0c;英语同传翻译北京本地同声传译的收费价格到底是多少呢&a…