分布式事务Seate

news2024/12/26 9:28:56

一、Seata简介

1、Seata的核心组件

TC (Transaction Coordinator)事务协调者:维护全局和分支事务的状态,协调全局事务提交或回滚。
TM (Transaction Manager)事务管理器:定义全局事务的范围、开始全局事务、提交或回滚全局事务。
RM (Resource Manager)资源管理器:管理分支事务处理的资源,与TC交谈以注册分支事务和报告分支事务的状态,并驱动分支事务提交或回滚。

2、Seata的工作流程

1.TM 向 TC 申请开启一个全局事务,全局事务创建成功后,TC 会针对这个全局事务生成一个全局唯一的 XID;
2.XID 通过服务的调用链传递到其他服务;
3.RM 向 TC 注册一个分支事务,并将其纳入 XID 对应全局事务的管辖;
4.TM 根据 TC 收集的各个分支事务的执行结果,向 TC 发起全局事务提交或回滚决议;
5.TC 调度 XID 下管辖的所有分支事务完成提交或回滚操作。

3、Seata 提供的模式

XA模式:强一致性分阶段事务模式,牺牲了一定的可用性,无业务侵入。
TCC模式:最终一致的分阶段事务模式,有业务侵入。
AT模式:最终一致的分阶段事务模式,无业务侵入,Seata默认模式。
SAGA模式:长事务模式,有业务侵入。

4、AT、XA的架构

AT、XA都采用两阶段提交

2PC

二、AT模式

以分布式系统为锚点,锁系统,不锁数据。

AT模式

1.配置文件 

seata:
  data-source-proxy-mode: AT # 默认就是AT

2.添加记录表

 lock_table 是TC服务关联的表,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 'branch transaction id',
  `xid` varchar(100) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT 'global transaction id',
  `context` varchar(128) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT 'undo_log context,such as serialization',
  `rollback_info` longblob NOT NULL COMMENT 'rollback info',
  `log_status` int(11) NOT NULL COMMENT '0:normal status,1:defense status',
  `log_created` datetime(6) NOT NULL COMMENT 'create datetime',
  `log_modified` datetime(6) NOT NULL COMMENT 'modify datetime',
  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;
-- ----------------------------
-- Records of undo_log
-- ----------------------------

-- ----------------------------
-- 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,
  `xid` varchar(96) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,
  `transaction_id` bigint(20) NULL DEFAULT NULL,
  `branch_id` bigint(20) NOT NULL,
  `resource_id` varchar(256) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,
  `table_name` varchar(32) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,
  `pk` varchar(36) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,
  `gmt_create` datetime NULL DEFAULT NULL,
  `gmt_modified` datetime NULL DEFAULT NULL,
  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;

三、XA模式

XA模式:基于数据库的XA协议来实现的2PC方案(锁数据),强一致性,性能较差

XA模式

四、TCC模式

TCC模式
import io.seata.rm.tcc.api.BusinessActionContext;
import io.seata.rm.tcc.api.BusinessActionContextParameter;
import io.seata.rm.tcc.api.LocalTCC;
import io.seata.rm.tcc.api.TwoPhaseBusinessAction;

@LocalTCC
public interface TCCService {

    @TwoPhaseBusinessAction(name = "deduct", commitMethod = "confirm", rollbackMethod = "cancel")
    void deduct(@BusinessActionContextParameter(paramName = "userId") String userId,
                @BusinessActionContextParameter(paramName = "money")int money);

    boolean confirm(BusinessActionContext ctx);

    boolean cancel(BusinessActionContext ctx);
}
import cn.itcast.account.entity.AccountFreeze;
import cn.itcast.account.mapper.AccountFreezeMapper;
import cn.itcast.account.mapper.AccountMapper;
import cn.itcast.account.service.AccountTCCService;
import io.seata.core.context.RootContext;
import io.seata.rm.tcc.api.BusinessActionContext;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

@Service
@Slf4j
public class TCCServiceImpl implements TCCService {

    @Autowired
    private AccountMapper accountMapper;

    @Autowired
    private AccountFreezeMapper freezeMapper;

    @Override
    @Transactional
    public void deduct(String userId, int money) {
        // 0.获取事务id
        String xid = RootContext.getXID();
        // 1.扣减可用余额
        accountMapper.deduct(userId, money);
        // 2.记录冻结金额,事务状态
        AccountFreeze freeze = new AccountFreeze();
        freeze.setUserId(userId);
        freeze.setFreezeMoney(money);
        freeze.setState(AccountFreeze.State.TRY);
        freeze.setXid(xid);
        freezeMapper.insert(freeze);
    }

    @Override
    public boolean confirm(BusinessActionContext ctx) {
        // 1.获取事务id
        String xid = ctx.getXid();
        // 2.根据id删除冻结记录
        int count = freezeMapper.deleteById(xid);
        return count == 1;
    }

    @Override
    public boolean cancel(BusinessActionContext ctx) {
        // 0.查询冻结记录
        String xid = ctx.getXid();
        AccountFreeze freeze = freezeMapper.selectById(xid);

        // 1.恢复可用余额
        accountMapper.refund(freeze.getUserId(), freeze.getFreezeMoney());
        // 2.将冻结金额清零,状态改为CANCEL
        freeze.setFreezeMoney(0);
        freeze.setState(AccountFreeze.State.CANCEL);
        int count = freezeMapper.updateById(freeze);
        return count == 1;
    }
}

五、SAGA模式

六、总结

AT、TCC、Saga 都是补偿型的,补偿型分布式事务机制因为不要求事务资源本身(如数据库)的机制参与,所以无法保证从事务框架之外的全局视角的数据一致性。XA 模式的加入,补齐了 Seata 在全局一致性场景下的缺口。

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

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

相关文章

2023下半年北京/上海/深圳软考(中/高级)认证招生

软考是全国计算机技术与软件专业技术资格(水平)考试(简称软考)项目,是由国家人力资源和社会保障部、工业和信息化部共同组织的国家级考试,既属于国家职业资格考试,又是职称资格考试。 系统集成…

Docker安装与启动

Docker安装与启动 文章目录 Docker安装与启动前言容器与虚拟机比较 1、安装Docker2、设置ustc的镜像3、Docker的启动与停止总结 前言 容器与虚拟机比较 虚拟机(VM)是计算机系统的仿真。简而言之,它可以在实际上是一台计算机的硬件上运行看起…

Docker教程

Docker 能解决的问题 ⾸先,我们先来看⼏个问题: 1. 合作开发的时候,在本机可以运⾏,在别⼈的电脑上跑不起来。 这⾥我们以 Java Web 应⽤程序为例,⼀个 Java Web 应⽤程序涉及很多东⻄,⽐如 JDK 、 Tomc…

机器学习 day21(Tensorflow代码实现)

Tensorflow代码实现 在tensorflow中训练神经网络模型的步骤:第一步:指定模型,并告诉tensorflow按何种方式计算。第二步:使用特定的损失函数编译模型。第三步:训练模型

企业知识管理要怎么做,才能清晰有序?

在当今快速变化的商业环境中,企业知识管理的重要性日益凸显。有效的知识管理可以帮助企业整理、保存和传递知识,提高员工的工作效率和创新能力,从而为企业获得竞争优势奠定基础。本文将介绍企业在进行知识管理时应采取的措施,以确…

微型导轨的使用寿命能达到多久?

微型导轨,顾名思义就是体积很小的导轨,一般是应用在小型化设备中的,像半导体设备,医疗设备,IC制造设备,X-Y table,精密测量及检测仪器,高速皮带驱动设备,高速移载设备等都…

传说中,让测试猿分分钟心酸的五大谣言

谣传1:测试无聊 综观现今软件测试的一些轶事,我对某些错误想法的频繁出现感到吃惊。尽管有很多可以罗列,但是我还是想分享测试的五个最常见的谣传(基于我短暂的经验)。我发现前三个盛行于一些主流的新闻文章&#xff…

STM32F407系统时钟的配置和查看方法

1、系统时钟的来源 STM32F407具有两个PLL,用于产生不同的时钟信号。这里主要来讨论主PLL时钟。主PLL时钟的时钟源有两个信号,分别是上边提到的HIS信号和HSE信号。PLL通过把这两个信号倍频,分频等达到更高频率的时钟信号。一般来说&#xff0…

Linux6.yum,git,gdb

1.yum三板斧 yum list :显示所有能安装的软件。 yum lisy | grep 软件 :搜索软件。 yum install -y :安装软件。 yum remove -y 软件 :删除已经安装的软件。 2.git git clone 仓库网址 :添加仓库,按回车之后。需要输入账户和密码。 git add 文件 :把文件添加…

图像几何变换、仿射变换、透视变换

图像几何变换:平移、缩放、旋转 图像旋转变换:(x,y)为原图像坐标系,(x’,y’)为以(x0,y0)为中心的笛卡尔坐标系,图像以x0,y0)为中心进行旋转。 图像坐标系->笛卡尔坐标系->图像坐标系。如果是以图像中心旋转,则left=W/2,right=H/2,其中W和H为图像旋转…

MinGW 编译jsoncpp 的下载和编译

目录 1. jsoncpp 的下载 1.1 下载地址,点击可直接下载 1.2 下载完解压内容如下 2. jsoncpp 的编译 2.1 配置 2.2 生成 3. jsoncpp测试使用 1. jsoncpp 的下载 1.1 下载地址,点击可直接下载 mirrors / open-source-parsers / jsoncpp GitCode 1…

数据库监控与调优【十五】—— ORDER BY语句优化

ORDER BY语句优化 最好的做法:利用索引避免排序 实验 目的:哪些情况下ORDER BY子句能用索引避免排序,哪些情况下不能 之前说过,BTree数据结构里面的关键字,也就是索引值都是按照顺序排列的,那么&#xf…

端午节粽子代码(python)需要的拿走,顺带给博主一点关注呗~~~~

import math from turtle import * #胡阳 # 画粽子 def rice_dumpling():pensize(4) # 画笔宽度pencolor(4, 60, 12) # 画笔颜色fillcolor(4, 70, 19) # 填充色begin_fill()fd(200) # 向前circle(15, 120) #画圆弧fd(200)circle(15, 120)fd(200)circle(15, 120)fd(200)circle(1…

自动化测试你一定要知道的几个技巧,包你受用终身

自动化测试是应用程序在非常短的时间内执行软件的整个生命周期的过程,使测试软件具有很大的充分性和有效性。在这个程序设计的系统中,测试人员编写一个脚本,并借助合适的软件对软件进行测试。自动化测试背后的基本目标是提高测试效率和提高软…

C 语言经典100例(菜鸟在线工具)

C 语言经典100例 C 语言经典100例 菜鸟工具 C代码在线运行工具 搜索引擎 前端开发

农产品批发采购APP开发 手机里的农产品市场

农业发展是民生之本,随着互联网时代的到来各行各业都迎来了新的发展机遇,农产品批发采购、配送服务等方面也发生了很大的改变,各种农产品商城APP、农产品批发采购平台、农产品供应管理系统的开发让包含农产品信息、数据、物流、配送、仓储、质…

关于tcp协议的18个常问面试题(进阶版)

TCP是一个基础协议,这里相关的十八个问题也都是常见的问题。无论是前端还是后端同学,都应该掌握的这些问题。过于基础的问题,比如TCP格式是什么 占多少字节 三次握手的流程等等,由于过于简单,我们不介绍,本…

Mabatis(CRUD)

Mybatis CRUD(数据和配置使用Mybatis快速入门) select标签 选择&#xff0c;查询语句: <select id"getUserById" resultType"com.louis.pojo.User" parameterType"int"></select>id:就是对应namespace中的方法名(就相当于重写了…

记录::windows11安装子系统ubuntu18.04+cuda

https://learn.microsoft.com/zh-cn/windows/wsl/install-manual https://zhuanlan.zhihu.com/p/436441212 目录 1、开启开发者模式 2、开启子系统 3、下载ubuntu 4、安装ubuntu 5、安装cuda 6、安装cudnn 7、安装桌面 2、桌面 3、Xfces&#xff08;前面2和这个二选一…

不需要数据线传输如何共享笔记软件内容?

在生活和工作中&#xff0c;手机电脑共享数据的情况非常多&#xff0c;比如“共享笔记内容”。每当遇到这种情况&#xff0c;很多人都会使用数据线或借助第三方社交平台&#xff0c;把信息或文件传输过去。不过&#xff0c;这两种方法一个安全性不能保障&#xff0c;尤其是使用…