微服务13-Seata的四种分布式事务模式

这篇具有很好参考价值的文章主要介绍了微服务13-Seata的四种分布式事务模式。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

XA模式

XA模式分为两种情况
提交成功:
微服务13-Seata的四种分布式事务模式,微服务,微服务,分布式,wpf

提交失败:

微服务13-Seata的四种分布式事务模式,微服务,微服务,分布式,wpf

具有强一致性seata相当于是在RM上做了一层封装;

微服务13-Seata的四种分布式事务模式,微服务,微服务,分布式,wpf

XA模式
优点
1.事务的强一致性,只要有失败的,TC事务协调者就会发送信息让RM回滚——>满足ACID原则
2.没有代码侵入,常用数据库都支持
缺点
1.第一阶段就要锁定数据库资源,但是却不提交,从而导致数据库所占用的资源不能释放(占数据库锁),性能较差
2.依赖关系型数据库实现事务

实现XA模式

步骤:

1.在yaml文件中开启XA代理模式

2.添加@GlobalTransactional注解开启全局事务

微服务13-Seata的四种分布式事务模式,微服务,微服务,分布式,wpf
微服务13-Seata的四种分布式事务模式,微服务,微服务,分布式,wpf
微服务13-Seata的四种分布式事务模式,微服务,微服务,分布式,wpf

AT模式

微服务13-Seata的四种分布式事务模式,微服务,微服务,分布式,wpf
利用快照来保证事务的一致性,来进行数据回滚;

微服务13-Seata的四种分布式事务模式,微服务,微服务,分布式,wpf

AT模式是一种最终一致的模式:因为RM资源管理器执行sql后会直接提交,那么此时如果是数据不一致的情况下,那么说明肯定是软一致,但是在阶段二时,AT模式RM资源管理器会利用快照进行数据回滚,从而保证最终一致;
AT模式直接提交,有利于提高效率

微服务13-Seata的四种分布式事务模式,微服务,微服务,分布式,wpf

AT模式的脏写问题(对同数据并发写的问题)

脏写问题:造成数据空转现象

什么是脏写:

简而言之,就是两个事务并发执行,修改同一条数据,我第一个事务修改并且提交之后,释放DB锁资源,第二个事务想要进行回滚,那么就会导致脏写——>前一个事务修改无效

微服务13-Seata的四种分布式事务模式,微服务,微服务,分布式,wpf
解决:对事务2造成数据空转现象进行处理

1.事务1先获取DB锁,并且保存快照
——>2.然后执行业务sql,我们在提交事务前获取全局锁(防止一提交事务,释放DB锁后,其他事务立马插入获取DB锁更改sql)
——>3.此时全局锁会记录操作当前数据的事务,让该事务持有全局锁,然后提交事务释放DB锁
——>4.此时其他事务可以争夺DB锁,执行业务sql
——>5.然后和之前一样,它也要获取全局锁,但是全局锁此时已经被事务1拿了,所以它会进行自旋(300ms)
——>6.然后事务1如果此时要根据快照恢复数据,那么就需要DB锁,但是DB锁此时被其他事务拿了
——>7.死锁现象发生
——>8.还好其他事务重试失败后会释放锁资源,因为获取全局锁失败,那么后面的事务提交也进行不了
——>9.事务1再次拿到DB锁,可以进行快照恢复数据了;

微服务13-Seata的四种分布式事务模式,微服务,微服务,分布式,wpf

其他事务不获取全局锁的一个情况(AT模式写隔离的实现)

利用了CAS的思想 :

实际上是有两份快照的:before-image、after-image

跟cas一样,before是我们要回滚目标的状态,而after是相当于验证的一个状态,如果满足after的内容,就可以设置为before;

如果不一样不满足的话,就会判断不能恢复回滚,那么我们可以记录异常发送警告;

微服务13-Seata的四种分布式事务模式,微服务,微服务,分布式,wpf

总结:

AT:在第一阶段RM直接提交事务,释放数据库资源,不需要像XA模式那样,还需要将状态返回给TC事务协调者,还利用了全局锁实现读写分离:将表执行的事务储存起来,相当于一个标识;
并且**没有代码侵入,seata自动完成回滚和提交——>seata相当于RM资源管理器的一个代理**

微服务13-Seata的四种分布式事务模式,微服务,微服务,分布式,wpf

实现AT模式

数据库表中:lock_table:全局锁,undo_log:放的是快照信息

微服务13-Seata的四种分布式事务模式,微服务,微服务,分布式,wpf
微服务13-Seata的四种分布式事务模式,微服务,微服务,分布式,wpf
微服务13-Seata的四种分布式事务模式,微服务,微服务,分布式,wpf

可以再下单途中在业务代码中加上断点的方式查看数据库表中记录的快照信息和AT模式的全局锁信息 他们会在业务结束时自动销毁清理干净

TCC模式

微服务13-Seata的四种分布式事务模式,微服务,微服务,分布式,wpf
微服务13-Seata的四种分布式事务模式,微服务,微服务,分布式,wpf
那我们TCC模式是怎么保证一致性?

首先我们想想AT模式,在第一阶段,通过对数据库锁的获取完成事务,事务都是隔离的,所以有人成功有人失败,只有在二阶段完成回滚才能够保证数据的最终一致性,中间还是出现了软状态;

TCC模式,为什么就不需要锁了呢?我们AT模式是利用全局锁来保证一致性的——>执行sql后提交前上一道全局锁,那么其他事务的sql就执行不了进行自旋,超时就释放DB锁,而TCC解决利用了每个事务都是预留资源进行处理——> 第一个事务冻结的金额和第二个事务冻结的金额是不一样的,跟其他事务是没有关系的,那么回滚事务也是跟其他事务不影响的,不需要加锁(类似Semaphore)

简而言之就是把事务所用到的资源预留起来 等后面的结果再来判断是扣除还是释放,预留起来后数据库原表中的数据已经扣除了,所以其他的业务请求也不会有影响

微服务13-Seata的四种分布式事务模式,微服务,微服务,分布式,wpf

TCC模式的关键在于有代码侵入:需要考虑Comfirm成功提交和Cancel数据回滚的编写

优点:1.TCC第一阶段直接提交事务,提交完直接释放数据库资源,AT的话也是直接执行,但是使用了全局锁来保存事务操作的一个状态,保证其他事务争夺不了,XA的话第一阶段就垃圾了,不会提交sql业务,需要把状态给到TC事务协调者进行判断是否回滚还是提交(是一提交或者回滚就是全局那种);
2.无需生成快照与全局锁,依赖的是一个补偿操作,因为事务直接提交的原则,所以其他事务是操作不到自己的,可用于非关系型数据库

微服务13-Seata的四种分布式事务模式,微服务,微服务,分布式,wpf

TCC实现

具体模式还得根据场景来,比如TCC,就很像Semaphore,一般来说是对一个共享资源进行操作,比如停车场的停车位,库存…,像下单服务就不适合了,因为你每次调用都是一个新的订单;

一个事务是可以有多个模式实现的

微服务13-Seata的四种分布式事务模式,微服务,微服务,分布式,wpf

微服务13-Seata的四种分布式事务模式,微服务,微服务,分布式,wpf

我们怎么样去判断是否空回滚和业务悬挂?

利用两者相互判断 根据冻结金额的那张表来判断 在进行try业务前 先查询一下冻结金额的表中的数据是否为空 如果不为空则证明已经执行了CANCEL操作 则需要直接拒绝try的操作,反之在进行cancel业务前,需要根据事务id查询一下冻结金额的表中的数据是否为空 如果为空的话则证明try业务还没做,需要进行空回滚,同时也需要记录数据,new一个新的对象将冻结金额设为0,以及其他数据set进去

业务分析

微服务13-Seata的四种分布式事务模式,微服务,微服务,分布式,wpf
微服务13-Seata的四种分布式事务模式,微服务,微服务,分布式,wpf

我们可以在BusinessActionContext中获取里面的参数

事务表:表示事务冻结金额,冻结金额状态发生改变——>表示那部分被锁定

事务id,用户id,冻结金额和状态

微服务13-Seata的四种分布式事务模式,微服务,微服务,分布式,wpf

业务方便代码的实现:

@Slf4j
@Service
public class AccountTCCServiceImpl implements AccountTCCService {

    @Autowired
    private AccountMapper accountMapper;

    @Autowired
    private AccountFreezeMapper accountFreezeMapper;

    @Override
    @Transactional
    public void deduct(String userId, int money) {
        //0.获取事务id
        String xid = RootContext.getXID();
        // 判断是否有冻结记录 有的话直接拒绝执行try业务
        AccountFreeze Freeze = accountFreezeMapper.selectById(xid);
        if (Freeze!=null) {
            //拒绝
            return;
        }
        //1.扣减可用余额
        accountMapper.deduct(userId, money);
        //2.记录冻结金额,记录事务状态
        AccountFreeze accountFreeze = new AccountFreeze();
        accountFreeze.setUserId(userId);
        accountFreeze.setFreezeMoney(money);
        accountFreeze.setState(AccountFreeze.State.TRY);
        accountFreeze.setXid(xid);
        accountFreezeMapper.insert(accountFreeze);

    }

    @Override
    public boolean confirm(BusinessActionContext ctx) {
        //0.获取事务id
        String xid = ctx.getXid();
        //1.删除数据
        int count = accountFreezeMapper.deleteById(xid);
        return count == 1;
    }

    @Override
    public boolean cancel(BusinessActionContext ctx) {
        //0.查询冻结记录
        AccountFreeze accountFreeze = accountFreezeMapper.selectById(ctx.getXid());
        String userId = (String) ctx.getActionContext("userId");
        //0.2.判断是否空回滚
        if (accountFreeze == null){
            accountFreeze = new AccountFreeze();
            accountFreeze.setUserId(userId);
            accountFreeze.setFreezeMoney(0);
            accountFreeze.setState(AccountFreeze.State.CANCEL);
            accountFreeze.setXid(ctx.getXid());
            accountFreezeMapper.insert(accountFreeze);
            return true;
        }

        //0.3 幂等判断
        if (accountFreeze.getState()==AccountFreeze.State.CANCEL){
            //已经处理过cancel了 无需重复业务
            return true;
        }

        //1.恢复可用余额
        accountMapper.refund(accountFreeze.getUserId(),accountFreeze.getFreezeMoney());

        //2.将冻结金额清零 改状态为cancel
        accountFreeze.setFreezeMoney(0);
        accountFreeze.setState(AccountFreeze.State.CANCEL);
        int count = accountFreezeMapper.updateById(accountFreeze);
        return count == 1;


    }
}

微服务13-Seata的四种分布式事务模式,微服务,微服务,分布式,wpf

Saga模式

与TCC模式类似,但是TCC第一阶段只是将资源进行冻结,真正的去除还是在第二阶段的,而Saga模式是直接提交本地事务,第二阶段直接操作事务本身:成功则什么都不做,失败则通过编写补偿业务来进行回滚;

与AT相比没有用锁,与TCC比没有冻结资源,性能较好;

失败用自定义的补偿来写;

缺点:

没有保证隔离性,既没有隔离预留资源又没有上锁,容易出现脏写

微服务13-Seata的四种分布式事务模式,微服务,微服务,分布式,wpf

总结

微服务13-Seata的四种分布式事务模式,微服务,微服务,分布式,wpf文章来源地址https://www.toymoban.com/news/detail-725734.html

到了这里,关于微服务13-Seata的四种分布式事务模式的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【springcloud微微服务】分布式事务框架Seata使用详解

    目录 一、前言 二、事务简介 2.1 原子性 2.2 一致性 2.3 隔离性 2.4 持久性

    2023年04月26日
    浏览(32)
  • 【SpringCloud】微服务保护(Sentinel)和分布式事务(Seata)

    建议学完该系列前篇 【SpringCloud】商城项目拆分微服务各个组件学习 然后再来看本文 然后学习 【RabbitMQ】交换机、队列、可靠性保证和延迟消息 在微服务远程调用的过程中,还存在几个问题需要解决。 首先是业务健壮性问题: 例如在之前的查询购物车列表业务中,购物车

    2024年01月25日
    浏览(45)
  • Java微服务分布式事务框架seata的TCC模式

    🌹作者主页:青花锁 🌹简介:Java领域优质创作者🏆、Java微服务架构公号作者😄 🌹简历模板、学习资料、面试题库、技术互助 🌹文末获取联系方式 📝 专栏 描述 Java项目实战 介绍Java组件安装、使用;手写框架等 Aws服务器实战 Aws Linux服务器上操作nginx、git、JDK、Vue Jav

    2024年03月23日
    浏览(35)
  • 分布式事务篇-2.1 阿里云轻量服务器--Docker--部署Seata

    本文介绍基于Seata 解决分布式事务,Seata 是一个服务所有首先需要对其进行部署。 Seata 是一款开源的分布式事务解决方案,致力于提供高性能和简单易用的分布式事务服务。Seata 将为用户提供了 AT、TCC、SAGA 和 XA 事务模式,为用户打造一站式的分布式解决方案。 拷贝完毕删

    2024年02月11日
    浏览(32)
  • 若依微服务 + seata1.5.2版本分布式事务(安装配置nacos+部署)

    若依官方使用的1.4.0版本seata,版本较低配置相对更麻烦一些 一、seata服务端下载,下载方式介绍两种入口,如下: 1、找到对应版本,下载 binary 即可。 下载包名为:seata-server-1.5.2.zip 2. github上下载   Releases · seata/seata · GitHub  找到对应的1.5.2版本,每个版本下都有一个缩放

    2024年02月09日
    浏览(38)
  • 分布式:一文吃透分布式事务和seata事务

    什么是事务 事务是并发控制的单位,是用户定义的一个操作序列。 事务特性 原子性(Atomicity): 事务是数据库的逻辑工作单位,事务中包括的诸操作要么全做,要么全不做。 一致性(Consistency): 事务执行的结果必须是使数据库从一个一致性状态变到另一个一致性状态。一致性

    2024年02月07日
    浏览(48)
  • 【分布式事务】Seata 开源的分布式事务解决方案

    Seata 是一款开源的分布式事务解决方案,致力于提供高性能和简单易用的分布式事务服务。Seata 将为用户提供了 AT、TCC、SAGA 和 XA 事务模式,为用户打造一站式的分布式解决方案。 阿里巴巴作为国内最早一批进行应用分布式(微服务化)改造的企业,很早就遇到微服务架构下

    2024年02月02日
    浏览(41)
  • Seata分布式事务

    本地事务,也就是传统的单机事务。在传统数据库事务中,必须要满足四个原则: 分布式事务,就是指不是在单个服务或单个数据库架构下,产生的事务,例如: 跨数据源的分布式事务 跨服务的分布式事务 综合情况 完成上面的操作需要访问三个不同的微服务和三个不同的

    2024年02月09日
    浏览(34)
  • 分布式事务 Seata

    事务(Transaction)是计算机科学中的一个重要概念,主要是指一个 完整的、不可分割的操作序列 。在关系型数据库中,事务通常用于描述对数据库进行的一系列操作的执行单元。 事务的ACID特性 : 原子性(Atomicity):事务是一个原子操作,要么全部执行,要么全部回滚。如

    2024年02月17日
    浏览(37)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包