Seata 四种事务模式

news2024/11/24 3:58:36

Seata 是一款开源的分布式事务解决方案,致力于提供高性能和简单易用的分布式事务服务。Seata 将为用户提供了 AT、TCC、SAGA 和 XA 事务模式,为用户打造一站式的分布式解决方案。 全文参考文献:中文文档

TC (Transaction Coordinator) - 事务协调者​

维护全局和分支事务的状态,驱动全局事务提交或回滚。

TM (Transaction Manager) - 事务管理器​

定义全局事务的范围:开始全局事务、提交或回滚全局事务。

RM (Resource Manager) - 资源管理器​

管理分支事务处理的资源,与TC交谈以注册分支事务和报告分支事务的状态,并驱动分支事务提交或回滚。

1.AT (Auto Transaction) 常用】

图片来源于百度:https://baijiahao.baidu.com/s?id=1773353152487462965&wfr=spider&for=pc
图片来源于百度: 百度安全验证

AT模式是无侵入的分布式事务解决方案,适用于不希望对业务进行改造的场景,几乎0学习成本。

AT模式支持的数据库有:MySQL、Oracle、PostgreSQL、 TiDB、MariaDB。

1.1 使用前提

基于支持本地 ACID 事务的关系型数据库。
Java 应用,通过 JDBC 访问数据库。

1.2 原理机制

一阶段:
业务数据和回滚日志记录在同一个本地事务中提交,释放本地锁和连接资源。

二阶段:
提交异步化,非常快速地完成。
回滚通过一阶段的回滚日志进行反向补偿。

1.3 写隔离

一阶段本地事务提交前,需要确保先拿到全局锁 。拿不到全局锁 ,不能提交本地事务。拿全局锁的尝试被限制在一定范围内,超出范围将放弃,并回滚本地事务,释放本地锁。

1.4 读隔离

在数据库本地事务隔离级别读已提交(Read Committed)或以上的基础上,Seata(AT 模式)的默认全局隔离级别是读未提交(Read Uncommitted) 。

1.5 详细执行流程

一阶段

1)解析SQL(得到SQL的类型,表,条件等相关的信息)。
2)查询前镜像(根据解析得到的条件信息,生成查询语句,定位数据)。
3)得到前镜像(业务数据的更新前数据)。
4)执行业务SQL(执行sql)。
5)查询后镜像(根据解析得到的条件信息,生成查询语句,定位数据)。
6)得到后镜像(业务数据的更新后数据)。
7)插入回滚日志(把前后镜像数据以及业务 SQL 相关的信息组成一条回滚日志记录,插入到 UNDO_LOG 表中)。
8)提交前,向TC注册分支:申请全局锁 。
9)本地事务提交(业务数据的更新和前面步骤中生成的 UNDO LOG 一并提交)。
10)将本地事务提交的结果上报给 TC。

二阶段-回滚

收到 TC 的分支回滚请求,开启一个本地事务,执行如下操作。
1)通过 XID 和 Branch ID 查找到相应的 UNDO LOG 记录。
2)数据校验(拿 UNDO LOG 中的后镜与当前数据进行比较,如果有不同,说明数据被当前全局事务之外的动作做了修改。这种情况,需要根据配置策略来做处理)。
3)根据UNDO LOG中的前镜像和业务SQL的相关信息生成并执行回滚的语句。
4)提交本地事务。并把本地事务的执行结果(即分支事务回滚的结果)上报给 TC。

二阶段-提交

收到 TC 的分支提交请求,把请求放入一个异步任务的队列中,马上返回提交成功的结果给 TC。
1)异步任务阶段的分支提交请求将异步和批量地删除相应 UNDO LOG 记录。

1.6 优缺点

优点:

一阶段完成后提交事务,快速释放资源,性能比较好。
利用全局锁实现读写隔离。
实现简单,对业务代码零入侵。

缺点:

两阶段期间属于弱一致阶段,最终一致。
由于增加快照写入,影响效率(整体强于XA)。
依赖数据库。

1.7 Demo

详细代码参考:Springboot 集成 Seata-CSDN博客

代码使用上与XA模式相同只需调整配置的的模式就可以。

seata:
  data-source-proxy-mode: AT # 开启AT事务

2.TCC(Try、Confirm、Cancel)

TCC 模式是高性能分布式事务解决方案,适用于核心系统等对性能有很高要求的场景。

TCC 模式是指支持把 自定义 的分支事务纳入到全局事务的管理中【强代码入侵】。

TCC模式不依赖数据源(1.4.2及之前),1.4.2版本之后增加了TCC防悬挂措施,需要数据源支持。

2.1 原理机制

一阶段 prepare 行为
二阶段 commit 或 rollback 行为

2.2 详细执行流程

一阶段 prepare 行为:调用自定义的 prepare 逻辑。
二阶段 commit 行为:调用自定义的 commit 逻辑。
二阶段 rollback 行为:调用自定义的 rollback 逻辑。

2.3 优缺点

优点:

一阶段完成后提交事务,快速释放资源,性能比较好。
无需要快照、无需全局锁,性能好。
不依赖数据库(本人使用1.3.0不需要,1.4.2之后需要),使用补偿机制。

缺点:

强代码入侵,需要手动写try confirm cancel。
软状态,最终一致。
需要考虑失败尝试,同时要处理好幂等等问题。

2.4 Demo

详细代码参考:Springboot 集成 Seata-CSDN博客

@LocalTCC //1.开启TCC事务
@TwoPhaseBusinessAction // 2.标记TCC模式,注解在try接口上,并且声明confirm、cancel接口

订单服务代码调整

@RestController
@RequestMapping("/orderTbl")
public class OrderTblController {

    @Resource
    private OrderTblService orderTblService;
    @Resource
    private OrderService orderService;

    @PostMapping("/add/{userId}/{money}")
    public CxResult<Boolean> add(@PathVariable("userId") String userId, @PathVariable("money") Integer money) {
        //return CxResult.success(orderTblService.add(userId, money));
        return CxResult.success(orderService.addOrder(userId, money));
    }

}


@Service
public class OrderService {

    @Resource
    private OrderTccService orderTccService;

    @DubboReference
    private AccountProviderService accountProviderService;

    @GlobalTransactional
    public Boolean addOrder(String userId, Integer money) {
        accountProviderService.addRecord(userId, money);
        orderTccService.prepareAdd(userId, money);
        if (money > 10000) {
            throw new BusinessException(ErrorMsg.COMMON_ERROR_1);
        }
        return Boolean.TRUE;
    }

}


@LocalTCC //1.开启TCC事务
public interface OrderTccService {

    // 2.标记TCC模式,注解在try接口上,并且声明confirm、cancel接口
    @TwoPhaseBusinessAction(name = "orderTcc", commitMethod = "commit", rollbackMethod = "rollback")
    Boolean prepareAdd(@BusinessActionContextParameter(paramName = "userId") String userId,
                       @BusinessActionContextParameter(paramName = "money") Integer money);

    boolean commit(BusinessActionContext businessActionContext);

    boolean rollback(BusinessActionContext businessActionContext);

}


@Service
@Slf4j
public class OrderTccServiceImpl implements OrderTccService {

    // 模拟数据库存储
    HashMap<String, Integer> map = Maps.newHashMap();

    @Resource
    private OrderTblService orderTblService;

    @Override
    public Boolean prepareAdd(String userId, Integer money) {
        String xid = RootContext.getXID();
        OrderTbl orderTbl = new OrderTbl();
        orderTbl.setUserId(userId);
        orderTbl.setMoney(money);
        orderTblService.save(orderTbl);

        map.put(xid, orderTbl.getId());
        log.info("prepareAdd xid = {} orderId = {} userid = {} money= {}", xid, orderTbl.getId(), userId, money);
        return Boolean.TRUE;
    }

    @Override
    @Transactional
    public boolean commit(BusinessActionContext businessActionContext) {
        log.info("commit xid = {}", businessActionContext.getXid());
        return null != map.remove(businessActionContext.getXid()) ? true : false;
    }

    @Override
    @Transactional
    public boolean rollback(BusinessActionContext businessActionContext) {
        log.info("rollback xid = {}", businessActionContext.getXid());
        Integer orderId = map.get(businessActionContext.getXid());
        orderTblService.removeById(orderId);
        return true;
    }

}

账户服务代码调整

@DubboService
public class AccountProvider implements AccountProviderService {

    @Resource
    private AccountTblService accountTblService;

    @Resource
    private AccountTccService accountTccService;

    @Override
    @GlobalTransactional
    public void addRecord(String userId, Integer money) {
//        AccountTbl accountTbl = new AccountTbl();
//        accountTbl.setUserId(userId);
//        accountTbl.setMoney(money);
//        accountTblService.save(accountTbl);
        accountTccService.prepareAdd(userId, money);
    }

}


@LocalTCC //1.开启TCC事务
public interface AccountTccService {

    // 2.标记TCC模式,注解在try接口上,并且声明confirm、cancel接口
    @TwoPhaseBusinessAction(name = "accountTcc", commitMethod = "commit", rollbackMethod = "rollback")
    Boolean prepareAdd(@BusinessActionContextParameter(paramName = "userId") String userId,
                       @BusinessActionContextParameter(paramName = "money") Integer money);

    boolean commit(BusinessActionContext businessActionContext);

    boolean rollback(BusinessActionContext businessActionContext);

}

@Service
@Slf4j
public class AccountTccServiceImpl implements AccountTccService {

    // 模拟数据库存储
    HashMap<String, Integer> map = Maps.newHashMap();

    @Resource
    private AccountTblService accountTblService;

    @Override
    public Boolean prepareAdd(String userId, Integer money) {
        String xid = RootContext.getXID();
        AccountTbl accountTbl = new AccountTbl();
        accountTbl.setUserId(userId);
        accountTbl.setMoney(money);
        accountTblService.save(accountTbl);
        map.put(xid, accountTbl.getId());
        log.info("prepareAdd xid = {} accountId = {} userid = {} money= {}", xid, accountTbl.getId(), userId, money);
        return Boolean.TRUE;
    }

    @Override
    @Transactional
    public boolean commit(BusinessActionContext businessActionContext) {
        log.info("commit xid = {} ", businessActionContext.getXid());
        return null != map.remove(businessActionContext.getXid()) ? true : false;
    }

    @Override
    @Transactional
    public boolean rollback(BusinessActionContext businessActionContext) {
        log.info("rollback xid = {} ", businessActionContext.getXid());
        Integer accountId = map.get(businessActionContext.getXid());
        accountTblService.removeById(accountId);
        return true;
    }
}

3.SAGA

Saga 模式是长事务解决方案,适用于业务流程长且需要保证事务最终一致性的业务系统,Saga 模式一阶段就会提交本地事务,无锁,长流程情况下可以保证性能,多用于渠道层、集成层业务系统。事务参与者可能是其它公司的服务或者是遗留系统的服务,无法进行改造和提供 TCC 要求的接口,也可以使用 Saga 模式。

Saga模式不依赖数据源。

待完善。

4.XA(eXtended Architecture)

XA模式是分布式强一致性的解决方案,但性能低而使用较少。

XA模式只支持实现了XA协议的数据库。Seata支持MySQL、Oracle、PostgreSQL和MariaDB。

4.1 优缺点

优点:
强一致性,满足ACID要求。
实现简单,对业务代码零入侵。

缺点:
需要关系型数据库支持。
整个过程长时间锁定资源,性能极差。

4.2 Demo

详细代码参考:Springboot 集成 Seata-CSDN博客

待完善。

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

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

相关文章

Redis入门指南学习笔记(2):常用数据类型解析

一.前言 本文主要介绍Redis中包含几种主要数据类型&#xff1a;字符串类型、哈希类型、列表类型、集合类型和有序集合类型。 二.字符串类型 字符串类型是Redis中最基本的数据类型&#xff0c;它是其他4种数据类型的基础&#xff0c;其他数据类型与字符串类型的差别从某种角度…

HALCON的综合应用案例【01】: 3D 算法处理在 Visual Studio 2019 C# 环境中的集成实例

前言: HALCON 为一款比较流行的商业视觉处理软件,他提供了多种开发的模式,可以在HALCON中开发,也可以将HALCON的设计通过导出库的形式集成到其他开发环境里面,以方便系统集成。本文为笔者自己的一个3D 视觉检测项目,利用HALCON的3D 库开发算法,然后,将算法集成到 MS-V…

指挥通信车360度3d虚拟互动展示系统的优势及特点

通信车是装有通信装备&#xff0c;用于保障通信联络的专用车辆&#xff0c;用于偏僻/特殊环境下的机动通信。并且机动通信局装备通常分为应急综合通信车、网络管理车、程控电话车、自适应跳频电台车、数字扩频接力车、散射通信车、卫星通信车、光缆引接车、线缆收放车和通信电源…

医疗数据可视化大屏:重构医疗决策的未来

医疗行业一直是信息密集型领域之一&#xff0c;它的复杂性不仅在于患者病历和医疗数据的海量积累&#xff0c;还包括了病情诊断、医疗资源分配、病患治疗等多层次的挑战。随着信息技术的不断发展&#xff0c;医疗数据可视化大屏成为了一种创新性的工具&#xff0c;它为医疗管理…

Linux学习笔记之一(计算机网络基础)

Linux learning note 1、计算机网络1.1、IP地址和MAC地址1.2、NAT、端口1.3、动态IP、静态IP、DHCP1.4、子网掩码、网关地址、DNS服务器1.5、TCP、UDP、ftp、http 2、虚拟机的网络管理2.1、桥接模式2.2、NAT模式2.3、仅主机模式2.4、总结 1、计算机网络 1.1、IP地址和MAC地址 …

python:将多个9波段影像tif文件转成numpy格式保存

作者:CSDN @ _养乐多_ 最近有粉丝问,如何将多个9波段的Aster影像tif文件转成numpy格式保存,然后输入网络进去训练。本文提供了两种思路和代码。 结果如下图所示, 文章目录 一、简单方法(分两步)二、端到端方法(一步到位)一、简单方法(分两步) 先将所有的多波段影像…

葡萄酒中的“多酚”有机化合物

“多酚”是在植物中发现的有机化合物&#xff0c;包括树皮、种子、坚果、茶叶和木材。单宁是一种多酚&#xff0c;它们完全是天然的&#xff0c;但是尝起来很苦。如果你是一个茶迷&#xff0c;你应该知道喝一口高单宁的红茶会使你的口腔内侧起皱。 葡萄也含有大量的单宁&#…

文心一言画图体验1.0

文心一言画图体验1 版本&#xff1a;文心大模型3.5 文心一言官方链接&#xff1a;https://yiyan.baidu.com/ 1、画一幅画&#xff1a;在大树下喝啤酒的熊猫&#xff0c;水墨风格&#xff0c;中国风&#xff0c;印象主义&#xff0c;写意&#xff0c;薄涂 2、画一幅画&#x…

一、VPN基础

VPN基础 1、定义及特征2、VPN优势3、VPN分类4、VPN体系结构5、VPN实现的模式 —————————————————————————————————————————————————— 1、定义及特征 虚拟专用网VPN是依靠Internet服务提供商ISP和网络服务提供商NSP在公共网…

如何保证跨国传输的安全性,了解这篇文章就够了

在当今的全球化时代&#xff0c;跨国传输是许多企业不可或缺的业务需求&#xff0c;无论是进行远程协作、数据分析、项目交付、市场拓展等&#xff0c;都需要在不同国家或地区之间进行数据、信息、货物或服务的传输。然而&#xff0c;跨国传输也面临着很多挑战和风险&#xff0…

中兴路由器、小米路由器无线信号强度对比

最近小米新推出的路由器小米AX3000T非常火&#xff0c;在网上看到有好多人都在安利&#xff0c;引起了我的兴趣&#xff0c;刚好老家的路由器用了这么久也是时候要换一个了&#xff0c;毕竟我妈老说上网卡??所以我立马就在PDD搞了一台回来&#xff0c;打算和我现在家里用的中…

【进程控制⑥】:进程替换/exec*()系列接口

【进程控制⑥】&#xff1a;进程替换/ exec*(&#xff09;系列接口 一.进程替换原理二.替换特点1.独立性2.唯一性3.不变性4.不返回 三.程序替换应用【exec*系列系统调用】①execl&#xff1a;②execlp&#xff1a;③execv&#xff1a;④execle&#xff1a; 一.进程替换原理 我…

【自动控制原理】数学模型:控制系统的运动微分方程、拉氏变换和反变换、传递函数

文章目录 第2章 数学模型基本概念2.1 控制系统的运动微分方程a. 常微分方程的一般标准形式b. 线性定常系统微分方程的一般标准形式 2.1.1 建立数学模型的一般步骤2.1.2 控制系统微分方程的列写 2.2 拉氏变换和反变换2.2.1 拉氏变换的定义2.2.2 典型函数的拉氏变换2.2.3 拉氏变换…

2023年鸿雁全国经销商大会暨秋季新品发布会圆满落幕

聚力同行&#xff0c;再起征程。11月2日&#xff0c;一场以“数字双翼&#xff0c;鸿雁奋飞”为主题的鸿雁全国经销商大会暨秋季新品布会在杭州盛大召开。鸿雁电器总裁王米成、副总裁吴明、副总裁夏晓衍、市场部总经理梁彩雷、灯饰与智能家居渠道部总经理王育炳、五金水暖渠道部…

照亮室外生活:户外灯具的创新趋势

日落之后&#xff0c;庭院变成了一个独特的世界&#xff0c;等待我们探索和享受。然而&#xff0c;要让庭院成为温馨、迷人的地方&#xff0c;户外照明起着关键作用。在这里&#xff0c;我们将讨论如何通过巧妙的户外照明&#xff0c;为庭院带来夜晚的魅力。 户外照明不仅是为了…

石油开采vr模拟生产安全体验平台提高员工上岗技能

近年以来我国矿山曾发生多起罐笼坠落事故&#xff0c;造成多人死伤&#xff0c;给企业和社会造成不良影响&#xff0c;事故的发生的主要原因多是人员违章、安全设施附件检修维护不到位。 钻井平台安全生产重于泰山&#xff0c;关乎经济社会发展大局&#xff0c;更关乎人们群众生…

StoneDB-8.0-V2.1.0 企业版正式发布!免费公测中!

很高兴告诉大家&#xff0c;我们StoneDB-8.0-V2.1.0企业版正式发布了&#xff01;经过一个月的开发&#xff0c;我们的研发团队用极高的效率对2.0新架构版本查漏补缺&#xff0c;完善了最新架构的代码&#xff0c;并对性能、稳定性做出了优化&#xff0c;同时也修复了一些用户们…

OmniGraffle Pro 7.22.2(思维导图工具)

OmniGraffle Pro是一款图表绘制和设计软件&#xff0c;它的主要特点包括&#xff1a; 功能强大&#xff1a;OmniGraffle Pro提供了丰富的图形设计工具&#xff0c;包括各种形状库、图层支持、自定义模板等&#xff0c;可以满足用户在图表绘制和设计方面的各种需求。智能连接和…

《Linux从练气到飞升》No.25 Linux中多线程概念

&#x1f57a;作者&#xff1a; 主页 我的专栏C语言从0到1探秘C数据结构从0到1探秘Linux菜鸟刷题集 &#x1f618;欢迎关注&#xff1a;&#x1f44d;点赞&#x1f64c;收藏✍️留言 &#x1f3c7;码字不易&#xff0c;你的&#x1f44d;点赞&#x1f64c;收藏❤️关注对我真的…

WIN11如何固定文件夹查看方式

找一个文件夹&#xff0c;设置成自己需要的视图方式 文件夹选项>查看>应用到文件夹 缺点&#xff1a;所有相同类型文件夹都会使用此视图