微服务系列文章之 seata 事务模式

分布式事务 Seata 及其三种模式详解 分布式事务产生的背景:分布式架构演进之 - 数据库的水平拆分蚂蚁金服的业务数据库起初是单库单表,但随着业务数据规模的快速发展,数据量越来越大,单库单表逐渐成为瓶颈。所以我们对数据库进行了水平拆分,将原单库单表拆分成数据库分片。如下图所示,分库分表之后,原来在一个数据库上就能完成的写操作,可能就会跨多个数据库,这就产生了跨数据库事务问题。分布式架构演进之 - 业务服务化拆分在业务发展初期,“一块大饼”的单业务系统架构,能满足基本的业务需求。 阅读详情

XA模式

XA 规范 是 X/Open 组织定义的分布式事务处理(DTP,Distributed Transaction Processing)标准。

XA 规范 描述了全局的TM与局部的RM之间的接口,几乎所有主流的数据库都对 XA 规范 提供了支持。

两阶段提交

XA是规范,目前主流数据库都实现了这种规范,实现的原理都是基于两阶段提交。

正常情况:

在这里插入图片描述

异常情况:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-C19o8PlR-1688289885692)(assets/image-20210724174234987.png)]

一阶段:

  • 事务协调者通知每个事物参与者(分支事务)执行本地事务
  • 本地事务执行完成后报告事务执行状态给事务协调者,此时事务不提交,继续持有数据库锁(行锁)

二阶段:

  • 事务协调者基于一阶段的报告来判断下一步操作
    • 如果一阶段都成功,则通知所有事务参与者,提交事务
    • 如果一阶段任意一个参与者失败,则通知所有事务参与者回滚事务

Seata的XA模型

Seata对原始的XA模式做了简单的封装和改造,以适应自己的事务模型,基本架构如图:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-BaJsbKAo-1688289885692)(assets/image-20210724174424070.png)]

RM一阶段的工作:

​ ① 注册分支事务到TC

​ ② 执行分支业务sql但不提交

​ ③ 报告执行状态到TC

TC二阶段的工作:

  • TC检测各分支事务执行状态

    a.如果都成功,通知所有RM提交事务

    b.如果有失败,通知所有RM回滚事务

RM二阶段的工作:

  • 接收TC指令,提交或回滚事务

优缺点

XA模式的优点是什么?

  • 事务的强一致性,满足ACID原则。
  • 常用(关系型)数据库都支持,实现简单,并且没有代码侵入

XA模式的缺点是什么?

  • 因为一阶段需要锁定数据库资源(行锁),等待二阶段结束才释放,性能较差
  • 依赖关系型数据库实现事务(redis不支持)

实现XA模式

Seata的starter已经完成了XA模式的自动装配,实现非常简单,步骤如下:

1)修改application.yml文件(每个参与事务的微服务),开启XA模式:

seata:
  data-source-proxy-mode: XA

在这里插入图片描述

2)给发起全局事务的入口方法添加@GlobalTransactional注解:
在这里插入图片描述

3)重启服务并测试

重启order-service,再次测试,发现无论怎样,三个微服务都能成功回滚。

AT模式

AT模式同样是分阶段提交的事务模型,不过缺弥补了XA模型中资源锁定周期过长的缺陷。

Seata的AT模型

在这里插入图片描述

阶段一RM的工作:

  • 注册分支事务
  • 记录undo-log(数据快照)
  • 执行业务sql并提交(不存在行锁)
  • 报告事务状态

阶段二提交(成功)时RM的工作:

  • 删除undo-log即可

阶段二回滚(失败)时RM的工作:

  • 根据undo-log恢复数据到更新前

流程梳理

例如,一个分支业务的SQL是这样的:update tb_account set money = money - 10 where id = 1

在这里插入图片描述

AT与XA的区别

简述AT模式与XA模式最大的区别是什么?

  • XA模式一阶段不提交事务,锁定资源;AT模式一阶段直接提交,不锁定资源。
  • XA模式依赖数据库机制实现回滚;AT模式利用数据快照实现数据回滚。
  • XA模式强一致;AT模式最终一致

脏写问题

在多线程并发访问AT模式的分布式事务时,有可能出现脏写问题,如图:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-xSU78Izf-1688289885694)(assets/e3dcf79de1fbddba280ac658bf420130.gif)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-9oRqFSQ8-1688289885694)(assets/image-20210724181541234.png)]

解决思路就是引入了Seata全局锁的概念。在释放DB锁之前,先拿到全局锁。避免同一时刻有另外一个事务来操作当前数据。

在这里插入图片描述

在这里插入图片描述

优缺点

AT模式的优点:

  • 一阶段完成直接提交事务,释放数据库资源,性能比较好
  • 利用全局锁实现读写隔离
  • 没有代码侵入,框架自动完成回滚和提交

AT模式的缺点:

  • 两阶段之间属于软状态,属于最终一致
  • 框架的快照功能会影响性能,但比XA模式要好很多

实现AT模式

AT模式中的快照生成、回滚等动作都是由框架自动完成,没有任何代码侵入,因此实现非常简单。

只不过,AT模式需要一个表来记录全局锁、另一张表来记录数据快照undo_log。

导入数据库表

seata-tc-server内部记录全局锁,每个微服务中需要存undo_log

在这里插入图片描述

修改application.yml文件

将事务模式修改为AT模式即可:

seata:
  data-source-proxy-mode: AT # 默认就是AT
重启服务并测试

TCC模式

TCC模式与AT模式非常相似,每阶段都是独立事务,不同的是TCC通过人工编码来实现数据恢复。需要实现三个方法:

  • Try:资源的检测和预留;
  • Confirm:完成资源操作业务;要求 Try 成功 Confirm 一定要能成功。
  • Cancel:预留资源释放,可以理解为try的反向操作。

TCC模式原理

举例,一个扣减用户余额的业务。假设账户A原来余额是100,需要余额扣减30元。

阶段一( Try ):检查余额是否充足,如果充足则冻结金额增加30元,可用余额扣除30

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-WjCSNWP9-1688289885696)(assets/c49e20fb2e2f6794d876680d89da2e24.gif)]

阶段二(Confirm):假如要提交(Confirm),则冻结金额扣减30

  • 确认可以提交,不过之前可用金额已经扣减过了,这里只要清除冻结金额就好了:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-LiZXUcBY-1688289885696)(assets/f64c610fae8ef8e68dfd744a587814c6.gif)]

阶段二(Canncel):如果要回滚(Cancel),则冻结金额扣减30,可用余额增加30

  • 需要回滚,那么就要释放冻结金额,恢复可用金额:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-JQ6pvxux-1688289885697)(assets/bc87af560fbecd35c6be0776440ce972.gif)]

Seata的TCC模型

Seata中的TCC模型依然延续之前的事务架构,如图:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-GjJkOUsi-1688289885697)(assets/image-20210724182937713.png)]

优缺点

TCC模式的每个阶段是做什么的?

  • Try:资源检查和预留
  • Confirm:业务执行和提交
  • Cancel:预留资源的释放

TCC的优点是什么?

  • 一阶段完成直接提交事务,释放数据库资源,性能好
  • 相比AT模型,无需生成快照,无需使用全局锁,性能最强
  • 不依赖数据库事务,而是依赖补偿操作,可以用于非事务型数据库(redis)

TCC的缺点是什么?

  • 有代码侵入,需要人为编写try、Confirm和Cancel接口,太麻烦
  • 软状态,事务是最终一致
  • 需要考虑Confirm和Cancel的失败情况,做好幂等处理(发一次请求执行结果,跟发10请求执行结果要求一致)

业务悬挂和空回滚

空回滚

当某分支事务的try阶段阻塞时,可能导致全局事务超时而触发二阶段的cancel操作。

在未执行try操作时先执行了cancel操作,这时cancel不能做回滚,就是空回滚。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-tHXudSdb-1688289885698)(assets/7c7d8e9a627fe093e26c44b82a8e048a.gif)]

执行cancel操作时,应当判断try是否已经执行,如果尚未执行,则应该空回滚。

业务悬挂

对于已经空回滚的业务,之前被阻塞的try操作恢复,继续执行try,就永远不可能confirm或cancel ,事务一直处于中间状态,这就是业务悬挂。

执行try操作时,应当判断cancel是否已经执行过了,如果已经执行,应当阻止空回滚后的try操作,避免悬挂

实现TCC模式

业务分析

为了实现空回滚、防止业务悬挂,以及幂等性要求。我们必须在数据库记录冻结金额的同时,记录当前事务id和执行状态,为此我们设计了一张表:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-tZcklKN7-1688289885698)(assets/image-20220406210505377.png)]

准备TCC环境

1)创建表

CREATE TABLE `tb_account_freeze`  (
  `xid` varchar(128) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL,
  `user_id` int(11) NOT NULL,
  `freeze_money` int(11) UNSIGNED NULL DEFAULT 0,
  `state` int(1) NULL DEFAULT NULL COMMENT '事务状态,0:try,1:confirm,2:cancel',  
  PRIMARY KEY (`xid`) USING BTREE
);

2)创建实体

@Data
@TableName("tb_account_freeze")
public class AccountFreeze {
    @TableId(type = IdType.INPUT)
    private String xid;
    private Integer userId;
    private Integer freezeMoney;
    private Integer state;

    public static abstract class State {
        public final static int TRY = 0;
        public final static int CONFIRM = 1;
        public final static int CANCEL = 2;
    }
}

3)AccountFreezeMapper

public interface AccountFreezeMapper extends BaseMapper<AccountFreeze> {
}
声明TCC接口
@LocalTCC
public interface AccountTCCService {

    /**
     *  一阶段:try 预留
     *  @TwoPhaseBusinessAction 定义 try confirm cancel 方法名
     */
    @TwoPhaseBusinessAction(name = "deduct", commitMethod = "confirm", rollbackMethod = "cancel")
    void deduct(@BusinessActionContextParameter(paramName = "userId") Integer userId,
                @BusinessActionContextParameter(paramName = "money") Integer money);

    /**
     *  二阶段:confirm 提交
     * @param ctx 可以获得 @BusinessActionContextParameter参数和xid
     * 
     */
    Boolean confirm(BusinessActionContext ctx);

    /**
     * 二阶段:cancel 回滚
     * @param ctx 可以获得 @BusinessActionContextParameter参数和xid
     *  
     */
    Boolean cancel(BusinessActionContext ctx);
}
实现TCC接口
package com.heima.account.service.impl;

import com.heima.account.entity.AccountFreeze;
import com.heima.account.mapper.AccountFreezeMapper;
import com.heima.account.mapper.AccountMapper;
import com.heima.account.service.AccountTCCService;
import com.sun.org.apache.regexp.internal.RE;
import io.seata.core.context.RootContext;
import io.seata.rm.tcc.api.BusinessActionContext;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

@Service
public class AccountTCCServiceImpl implements AccountTCCService {

    @Autowired
    private AccountMapper accountMapper;

    @Autowired
    private AccountFreezeMapper freezeMapper;

    @Override
    public void deduct(Integer userId, Integer money) {
        // 0.获取事务id
        String xid = RootContext.getXID();
        // 解决业务悬挂
        AccountFreeze oldFreeze = freezeMapper.selectById(xid);
        if (oldFreeze != null) {
            return;
        }
        // 1.扣除可用余额
        accountMapper.deduct(userId, money);
        // 2.记录冻结金额,事务状态
        AccountFreeze freeze = new AccountFreeze();
        freeze.setXid(xid);
        freeze.setUserId(userId);
        freeze.setFreezeMoney(money);
        freeze.setState(AccountFreeze.State.TRY);
        freezeMapper.insert(freeze);

    }

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

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

        // 解决空回滚
        if (freeze == null) {
            int userId = Integer.parseInt(ctx.getActionContext("userId").toString());
            freeze = new AccountFreeze();
            freeze.setXid(xid);
            freeze.setUserId(userId);
            freeze.setFreezeMoney(0);
            freeze.setState(AccountFreeze.State.CANCEL);
            freezeMapper.insert(freeze);
            return true;
        }

        // 解决幂等性
        if (freeze.getState() == AccountFreeze.State.CANCEL) {
            return true;
        }

        // 2.恢复账户金额
        accountMapper.refund(freeze.getUserId(), freeze.getFreezeMoney());
        // 3.更新冻结记录
        freeze.setFreezeMoney(0);
        freeze.setState(AccountFreeze.State.CANCEL);
        int count = freezeMapper.updateById(freeze);
        return count == 1;
    }
}
修改Controller

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-UVjycx8D-1688289885699)(assets/image-20220330120549262.png)]

重启测试

SAGA模式(了解)

Saga模式是SEATA提供的长事务解决方案。也分为两个阶段:

  • 一阶段:直接提交本地事务
  • 二阶段:成功则什么都不做;失败则通过编写补偿业务来回滚

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-QHaiOmG1-1688289885700)(assets/image-20220330120817862.png)]

Saga模式优点:

  • 事务参与者可以基于事件驱动实现异步调用,吞吐高
  • 一阶段直接提交事务,无锁,性能好
  • 不用编写TCC中的三个阶段,实现简单

缺点:

  • 软状态持续时间不确定,时效性差
  • 没有锁,没有事务隔离,会有脏写

四种模式对比

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-UFJVPg1a-1688289885700)(assets/image-20220330120948669.png)]

分布式事务(四)Seata AT模式-Spring Cloud微服务案例 文章目录订单业务案例创建 Empty Project:seata-at数据库初始化工具新建Module:db-initapplication.yml 配置添加 sql 脚本文件主程序中添加代码,执行sql脚本xxxxxxeureka注册中心父项目account账户项目storage库存项目order订单项目全局唯一id发号器order订单添加Feign,调用库存和账户服务 订单业务案例 创建 Empty Project:seata-at 先新建文件夹 seata-samples,后面测试的 Seata 阅读详情

相关推荐

什么是分布式事务Seata?Seata的几种事务模式详解

目录概念发展历程核心组件三种事务模式AT模式前提一个分布式事务在Seata中的执行流程MySQL XA方案MySQL XA中拥有两种角色:TCC模式Saga模式 概念 Seata(原名Fescar) 是 阿里巴巴 开源的 分布式事务中间件,以 高效 并且对业务 0 侵入 的方式,解决 微服务 场景下面临的分布式事务问题。 发展历程 2014 年,阿里中间件团队发布 TXC(Taobao Trans...

weixin_45661382的博客 4330

记录seata做分布式事务时出现多线程同时开启分布式事务出现的错误

遇到的问题就是:在做秒杀系统的过程中,使用了async异步处理秒杀请求,并自定义了线程池,然后使用seata保证分布式事务事务完整性,但是在jemeter测试的过程中出现了以下的错误: org.springframework.jdbc.UncategorizedSQLException: ### Error updating database. Cause: java.sql.SQLException: io.seata.core.exception.TransactionException: R.

qq_41617848的博客 4554

SpringCloud实战:Seata分布式事务整合指南

本文介绍了SpringCloud分布式事务框架Seata的安装与使用。主要内容包括:1) Seata服务端配置,包括Nacos注册中心设置和配置上传;2) 项目改造步骤,添加Seata依赖和事务分组配置;3) 业务数据库准备和关键代码实现(@GlobalTransactional注解使用);4) 网关路由配置和测试验证方法。文章详细演示了如何在微服务架构中通过Seata解决跨服务事务一致性问题,包括正常提交和异常回滚场景的测试验证,为开发者提供了完整的分布式事务解决方案实践指南。

技术Z先生的博客 1545

Apache Seata分布式事务及其三种模式详解

本文根据 8 月 11 日 SOFA Meetup#3 广州站 《分布式事务 Seata 及其三种模式详解》主题分享整理,着重分享分布式事务产生的背景、理论基础,以及 Seata 分布式事务的原理以及三种模式(AT、TCC、Saga)的分布式事务实现

IT云清 1462

SpringCloud微服务接入分布式事务框架Seata实战,【一个注解解决分布式事务】

文章目录一、配置启动Seata Server1.1 环境准备1)指定nacos作为配置中心和注册中心2)同步seata server的配置到nacos3) 启动Seata Server二、Seata如何整合到Spring Cloud微服务2.1 导入依赖2.2 微服务对应数据库中添加undo_log表2.3 微服务需要使用seata DataSourceProxy代理自己的数据源2.4 添加seata的配置1)将registry.conf文件拷贝到resources目录下,指定注册中心和配置中心都是naco

沮丧的南瓜 3280

分布式事务Seata源码解析13:TCC事务模式实现原理

1、TCC事务模式实现原理; 2、TCC资源TCCResource解析; 3、TCCResource注册到TC的流程; 4、TCC执行上下文BusinessActionContext详解; 5、TCC分支事务执行流程、ActionInterceptorHandler解析; 6、@LocalTCC使用原理、@TwoPhaseBusinessAction使用原理、@BusinessActionContextParameter使用原理; 7、TCC分支事务提交、回滚原理。

健身变秃,coding变强 5849

Seata四种事务模式介绍+示例代码

Seata是一款支持多种分布式事务模式的框架,它可以根据不同的业务场景和需求,选择合适的模式来实现数据的一致性。Seata的四种模式各有优缺点,需要根据具体情况进行权衡和选择。模式一致性可用性侵入性复杂度XA强低低高AT最终高低中TCC最终高高高SAGA最终高高中Seata官方网站:https://seata.io/Seata官方文档:https://seata.io/en-us/docs/overview/what-is-seata.html。

islautao的博客 7459

新版本大疆智图4.5 永久许可摄影测量建模软件

大疆智图支持常见格式的成果输出,包括 TIFF 正射影像和高程模型、LAS 格式点云,以及 B3DM、OSGB、OBJ 等六种常用格式的三维模型,还包括 DXF 和 SHP 等格式的等高线。大疆智图 DJI Terra是领先的三维重建软件,提供先进的技术和简单的操作,一站式解决方案,从航线规划到数据的获取,以及模型重建、数据分析等都提供独一无二的支持,优化项目工程,提供自动化优势,获得更有效智能的决策和行动,最终用户可以获得理想的结果,减轻工作压力,提高作业效率。质量报告和剖面查看功能有助于分析点云质量。

qq_62821232的博客 6886

seate分布式锁三种模式

介绍seate分布式锁的主要三种模式,分析三种模式的运行原理,深入浅出,更易于明白seate是如何保证事物的一致性

qq_54421200的博客 5061

告别QQ截图!用C# Winform + 百度AI,自己动手做一个免费的文字提取小工具

本文详细介绍了如何利用C# Winform和百度AI OCR接口开发一款免费的文字提取工具,替代QQ截图功能。通过智能截图模块、OCR服务集成和主界面功能整合,实现高效准确的文字识别,适用于日常办公和学习场景。工具支持图像预处理、异步处理和错误日志记录,提升用户体验和识别准确率。

weixin_30566063的博客 378

思科模拟器汉化教程(附带中文汉化包)

思科模拟器是一种模拟Cisco网络设备的软件工具。它可以模拟Cisco网络设备的所有功能,包括路由器、交换机、防火墙等,并提供了一个可视化的用户界面,让用户可以通过图形化的方式来管理网络设备。思科模拟器因其便捷、易用的特点被广泛应用于网络工程师的实验、测试和培训等方面思科模拟器的功能是强大的,但当我们在使用思科模拟器的时候就会有一些烦恼,由于思科是全球最大的企业级网络设备供应商之一。思科公司的产品和服务被广泛应用于各种领域和行业,所以思科模拟器默认是全英文的,但是在最新版本中是支持中文的。

2302_76908369的博客 4万+

Seata Saga模式:长事务解决方案探索

Seata Saga模式:长事务解决方案探索 【免费下载链接】incubator-seata 项目地址: https://gitcode.com/gh_mirrors/in/incubator-seata ...

gitblog_00846的博客 1069

移动端抓包实战指南:从HTTPS解密到QUIC协议与证书绑定破解

HTTPS作为保障网络通信安全的核心协议,其工作原理基于TLS/SSL加密与证书信任链验证。在移动应用开发与测试中,抓包是调试接口、分析性能、排查问题的关键技术手段。然而,随着移动端安全性的提升,传统的代理抓包方法常因证书绑定、HTTP/3/QUIC协议等挑战而失效。这要求开发者掌握分层诊断思维,协同使用代理工具、协议分析工具及底层流量捕获工具。例如,面对证书绑定导致的流量不可见,需借助Wireshark进行协议层分析;针对基于UDP的QUIC协议,则需使用支持该协议的抓包工具或临时禁用特性。本文聚焦移动端

weixin_27722377的博客 296

Java微服务分布式事务框架seata的TCC模式

上一章节介绍微服务分布式项目中,使用的事务框架seata,本章节介绍分布式事务框架seata TCC模式,以及集成到Springboot、微服务框架里。

Java 技术专栏,从入门到精通,熟悉企业级开发 1万+

【大模型】DeepSeek 高级提示词技巧使用详解

DeepSeek 高级提示词技巧使用详解

congge 1万+

yolov8知识蒸馏代码详解:支持logit和feature-based蒸馏

特别地,在COCO数据集上对MAP中的RetinaNet检测器(resnet50主干)获得了3.4%的性能提升,在Cityscapes数据集上, 针对mIoU指标,PSPNET(resnet-18 backbone)获得5.81%的性能提升。大部分的KD方法都是通过algin学生网络和教师网络的归一化的feature map, 最小化feature map上的激活值的差异。MGD是一种真正通用的基于特征feature的知识蒸馏方法,它可以用于各种任务,包括图像分类,目标检测,语义分割和实例分割。

@bangbang的博客 7285

Java微服务分布式事务框架seata

本章节介绍微服务分布式项目中,使用的事务框架seata。官网:http://seata.io/zh-cn/Data

Java 技术专栏,从入门到精通,熟悉企业级开发 1万+

【Bluetooth蓝牙开发】一、开篇词 | 打造全网最详细的Bluetooth开发教程

1、开篇词 2、蓝牙开发入门 3、蓝牙协议栈总览 4、蓝牙协议栈——物理层 5、蓝牙协议栈——链路层 6、蓝牙协议栈——传输层 7、蓝牙协议栈——L2CAP协议 8、蓝牙协议栈——ATT协议 9、蓝牙协议栈——GATT协议 10、蓝牙通信流程分析 11、蓝牙协议栈——Bluez交叉编译 12、蓝牙调试工具汇总

Donge's Blog 1万+

微服务篇-深入了解 XA 模式与 AT 模式、分布式事务(部署 TC 服务、微服务集成 Seata )

GlobalTransactional 注解就是在标记事务的起点,将来 TM 就会基于这个方法判断全局事务范围,初始化全局事务。首先,要在配置文件中指定要采用的分布式事务模式。Processing)标准,XA 规范描述了全局的 TM 与局部的 RM 之间的接口,几乎所有主流的数据库。册一下分支事务,属于哪个全局,然后才能去执行业务 sql,sql 执行完后,但是 XA 规范规定 sql。每一个分支事务就是传统的单体事务,都可以满足 ACID 特性,但全局事务跨越多个服务,

小扳手 3437

Windows10下安装VMware16虚拟机

由于本人系统为Windows 10 家庭中文版,无法安装Linux子系统WSL,虽然网上也有强制安装的方法,但为保险起见,还是把之前的VMware虚拟机重新进行安装,并浅浅记录一下安装过程。

沉香best的博客 863

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

Seata分布式事务模式详细整理

Seata 文章目录SeataSeata介绍——简单可扩展自治事务框架Seata支持的事务模型:Seata特性支持多个微服务框架高可用高可扩展Seata框架组成模块全局事务定义事务流程模型Seata中的事务模式能力边界条件:限制:Seata各模式详细介绍1. AT模式 —— Seata中的分布式事务最优解特点AT的执行流程第一步 - 执行逻辑第二步AT模式的回滚细节与事务隔离事务隔离问题出现的可能性解决方法AT回滚操作步骤AT模式中的事务隔离级别2. TCC模式传统TCC模式Seata TCC实现原理TCC

weixin_41263382的博客 4882

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

Seata分布式事务的四种模式

seata分布式事务的四种模式实现

逐梦苍穹的博客 4615

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

Springboot+Seata整合以及事务模式分析

分布式事务 一、分布式事务的组成部分 事务参与者:对应的一个一个的微服务 资源服务器:对应一个个微服务的数据库 事务管理器:决策各个事务参与者的提交和回滚 两阶段提交: 准备阶段:向事务管理器向事务参与者发送预备请求,事务参与者在写本地的redo和undo日志,但是不提交,并且返回准备就绪的信息,最后提交的动作交给第二阶段来进行 提交阶段:如果事务协调者收到失败或者超时的信息,直接给每个参与者发送回滚消息;否则提交消息,最后根据协调者的指令释放所有事务处理过程中使用的资源锁 二、项目例子 当前依赖,

何忆清风 9万+

分布式事务(五)Seata AT模式-Spring Cloud微服务添加 AT 分布式事务

文章目录Seata Server - TC全局事务协调器Seata Server 配置registry.conffile.conf启动参数设置启动 Seata Serverorder订单服务添加 Seata AT 事务storage库存服务添加 Seata AT 事务account账户服务添加 Seata AT 事务 Seata Server - TC全局事务协调器 在《分布式事务(三)Seata分布式事务框架-AT模式介绍》 中介绍了 Seata AT 事务原理,介绍了 AT 事务的三个角色:TC(事务

wanght笔记 1万+

Seata源码分析 全局事务开启&提交&回滚流程

Seata源码版本为1.7.0源码下载路径一阶段这是分支事务主要的执行流程,不在本章节的源码分析范围内业务数据和志记录在同回滚日一个本地事务中提交,释放本地锁和连接资源。核心在于对业务sql进行解析,转换成undolog,并同时入库二阶段分布式事务操作成功,则TC通知RM异步删除undolog分布式事务操作失败,TM向TC发送回滚请求,RM 收到协调器TC发来的回滚请求,通过 XID 和 Branch ID 找到相应的回滚日志记录,通过回滚记录生成反向的更新 SQL 并执行,以完成分支的回滚。Seata生命

qq_44027353的博客 1674

Seata实战-AT模式分布式事务原理、源码分析

文章目录前言第一阶段第二阶段源码分析入口之Seata集成SpringTmClient.init()RmClient.init()第一阶段拦截器中开启事务业务逻辑执行与sql解析第二阶段 前言 上回文章里简单介绍了分布式事务相关概念,并测试跑通了Seata中AT模式Demo和TCC模式Demo,对Seata不了解的可以先看下 https://blog.youkuaiyun.com/hosaos/article...

hosaos的博客 1万+
上一篇: DevOps系列文章之 设计一个简单的DevOps系统
下一篇: DevOps系统文章之 JGit--将 Git 嵌入你的应用
Coder_Boy_
博客等级 码龄10年 2804粉丝 819原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Coder_Boy_

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值