SpringCloud Alibaba Seata 分布式事务

Alibaba Seata 详解 Seata 是微服务架构下分布式事务的最优解之一,通过多事务模式适配不同场景无侵入的编程方式高性能的协议设计,解决了传统分布式事务方案的痛点。在实际开发中,90% 以上的微服务业务可直接使用AT 模式,实现分布式事务的快速落地;对于高一致性要求的金融业务,使用 TCC 模式;对于长事务、多步骤业务,使用 SAGA 模式,真正做到「按需选择」。其开源生态活跃,持续迭代优化,已成为阿里系微服务技术栈(Spring Cloud Alibaba)的核心组件,也是国内分布式事务中间件的事实标准。 阅读详情

概述

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

分布式事务(Distributed Transaction)特指多个服务同时访问多个数据源的事务处理机制,分布式是相对于服务而言的,更严谨地说,应该被称为在分布式服务环境下的事务处理机制。一般的单体应用,如果使用多个数据源,才需要面临分布式事务的问题(要考虑多个数据源的一致性)。

分布式计算领域中有个著名的 CAP 定理(Consistency、Availability、Partition Tolerance Theorem),Seata 就是为了解决这问题而诞生的。

四种事务模式

Seata 是一站式的分布事务的解决方案,提供四种事务模式,可参考 Seata 官方文档:

  1. AT 模式
  2. TCC 模式
  3. Saga 模式
  4. XA 模式

目前使用的流行度情况是:AT > TCC > Saga > XA。因此使用 Seata 的时候,可以花更多精力在 AT 模式上,要搞懂背后的实现原理,毕竟分布式事务涉及到数据的正确性,出问题需要快速排查定位并解决。

Seata 的三大角色

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

其中,TC 为单独部署的 Server 服务端,TM 和 RM 为嵌入到应用中的 Client 客户端。如何安装 TC,可参考 Docker Compose 部署

由于 Seata 也是 SpringCloud Alibaba 的一员,安装的时候使用 Nacos 作为注册中心,如果对 Nacos 不熟悉,可参考 Nacos 注册中心与配置中心

一个分布式事务的生命周期如下:
在这里插入图片描述

  1. TM 请求 TC 开启一个全局事务。TC 会生成一个 XID 作为该全局事务的编号(全局锁)。

XID,会在微服务的调用链路中传播,保证将多个微服务的子事务关联在一起。

  1. RM 请求 TC 将本地事务注册为全局事务的分支事务,通过全局事务的 XID 进行关联。

  2. TM 请求 TC 告诉 XID 对应的全局事务是进行提交还是回滚。

  3. TC 驱动 RM 们将 XID 对应的自己的本地事务进行提交还是回滚。

Seata 支持

  • Dubbo:seata-dubbo
  • SOFA-RPC:seata-sofa-rpc
  • Motan:seata-motan
  • gRPC:seata-grpc
  • Apache HttpClient:seata-http
  • Spring Cloud OpenFeign:spring-cloud-starter-alibaba-seata
  • Spring RestTemplate:spring-cloud-starter-alibaba-seata

由此可见, Seata 内置对 Dubbo 和 Feign 这两种方式都有很好的集成,提供分布式事务的功能。

因为 Seata 是基于 DataSource 数据源进行代理来拓展,所以天然对主流的 ORM 框架提供了非常好的支持:MyBatis、MyBatis-Plus、JPA、Hibernate

安装

可参考 Docker Compose 一站式安装

事务模式

AT 模式

整体机制:
AT 模式分为两阶段提交:

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

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

写隔离

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

读隔离

在数据库本地事务隔离级别 读已提交(Read Committed) 或以上的基础上,Seata(AT 模式)的默认全局隔离级别是 读未提交(Read Uncommitted) 。如果应用在特定场景下,必需要求全局的 读已提交 ,目前 Seata 的方式是通过 SELECT FOR UPDATE 语句的代理。

SELECT FOR UPDATE 语句的执行会申请 全局锁 ,如果 全局锁 被其他事务持有,则释放本地锁(回滚 SELECT FOR UPDATE 语句的本地执行)并重试。这个过程中,查询是被 block 住的,直到 全局锁 拿到,即读取的相关数据是 已提交 的,才返回。

AT 演示

这里以 Feign 为主,Seata 提供了 spring-cloud-starter-alibaba-seata 项目,对 Spring Cloud 进行集成。实现原理是:

服务消费者,使用 Seata 封装的 SeataFeignClient 过滤器,在使用 Feign 发起 HTTP 调用时,将 Seata 全局事务 XID 通过 Header 传递。

服务提供者,使用 Seata 提供的 SpringMVC SeataHandlerInterceptor 拦截器,将 Header 中的 Seata 全局事务 XID 解析出来,设置到 Seata 上下文 中。

如此,我们便实现了多个 Spring Cloud 应用的 Seata 全局事务的传播。

以经典的用户购买商品的业务逻辑,来作为具体示例,一共会有三个服务:Order 订单服务、Product 商品服务、Account 账户服务,分别对应自己的数据库。

Product 与 Account 作为服务提供者,提供 Restful API,Order 作为服务消费者通过 OpenFeign 进行 HTTP 调用。具体如下:

在这里插入图片描述
代码仓库,基本结构是
在这里插入图片描述
初始化数据库
在 数据库表 中,我们可以看到,每个表中,都有相对应的 undo_log 表,这是 Seata AT 模式必须创建的表,主要用于分支事务的回滚。

在 order-service 项目中,作为订单服务。它主要提供 /order/create 接口,实现创建订单服务。
在这里插入图片描述
引入依赖

基本上所有的依赖文件都差不多

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <parent>
        <groupId>com.rcrime.cloud</groupId>
        <artifactId>seata-feign-demo</artifactId>
        <version>1.0-SNAPSHOT</version>
    </parent>
    <modelVersion>4.0.0</modelVersion>

    <properties>
        <maven.compiler.target>1.8</maven.compiler.target>
        <maven.compiler.source>1.8</maven.compiler.source>
        <!-- 统一依赖管理 -->
        <spring.boot.version>3.3.4</spring.boot.version>
        <spring.cloud.version>2023.0.3</spring.cloud.version>
        <spring.cloud.alibaba.version>2023.0.1.2</spring.cloud.alibaba.version>
        <lombok.version>1.18.34</lombok.version>
    </properties>

    <artifactId>order-service</artifactId>


    <dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-parent</artifactId>
                <version>${spring.boot.version}</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-dependencies</artifactId>
                <version>${spring.cloud.version}</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
            <dependency>
                <groupId>com.alibaba.cloud</groupId>
                <artifactId>spring-cloud-alibaba-dependencies</artifactId>
                <version>${spring.cloud.alibaba.version}</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
            <dependency>
                <groupId>org.projectlombok</groupId>
                <artifactId>lombok</artifactId>
                <version>${lombok.version}</version>
            </dependency>
        </dependencies>
    </dependencyManagement>

    <dependencies>
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
        </dependency>
        <!-- MVC -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>

        <!-- DB -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-jdbc</artifactId>
        </dependency>
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>5.1.48</version>
        </dependency>
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>druid-spring-boot-starter</artifactId>
            <version>1.1.10</version>
        </dependency>
        <dependency>
            <groupId>org.mybatis.spring.boot</groupId>
            <artifactId>mybatis-spring-boot-starter</artifactId>
            <version>2.1.2</version>
        </dependency>

        <!-- Spring Cloud Alibaba Seata -->
        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-alibaba-seata</artifactId>
        </dependency>
        <dependency>
            <groupId>io.seata</groupId>
            <artifactId>seata-spring-boot-starter</artifactId>
            <version>1.1.0</version>
        </dependency>

        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
        </dependency>

        <!-- Spring Cloud OpenFeign -->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-openfeign</artifactId>
        </dependency>
    </dependencies>
</project>

配置文件

server:
  port: 8081 # 端口

spring:
  application:
    name: order-service

  datasource:
    url: jdbc:mysql://127.0.0.1:3306/seata_order?useSSL=false&useUnicode=true&characterEncoding=UTF-8
    driver-class-name: com.mysql.jdbc.Driver
    username: root
    password: 123456

  cloud:
    # Nacos 作为注册中心的配置项
    nacos:
      discovery:
        server-addr: 127.0.0.1:8848

# Seata 配置项,对应 SeataProperties 类
seata:
  application-id: ${spring.application.name} # Seata 应用编号,默认为 ${spring.application.name}
  tx-service-group: ${spring.application.name}-group # Seata 事务组编号,用于 TC 集群名
  # Seata 服务配置项,对应 ServiceProperties 类
  service:
    # 虚拟组和分组的映射
    vgroup-mapping:
      order-service-group: default
  # Seata 注册中心配置项,对应 RegistryProperties 类
  registry:
    type: nacos # 注册中心类型,默认为 file
    nacos:
      cluster: default # 使用的 Seata 分组
      namespace: dev # Nacos 命名空间
      serverAddr: localhost # Nacos 服务地址

上面的事务分组是什么呢?

  • 事务分组:seata 的资源逻辑,可以按微服务的需要,在客户端对自行定义事务分组,每组取一个名字。
  • 集群:seata-server 服务端一个或多个节点组成的集群 cluster。 客户端使用时需要指定事务逻辑分组与 Seata 服务端集群的映射关系。

相关文档

简单来说,就是多了一层虚拟映射。这里不设置 seata.service.grouplist 配置项,因为从注册中心加载 Seata TC Server 的地址。

如果不使用 Nacos 注册中心,就需要设置此配置项,不过也可以少了 seata.registry 配置项

seata.registry 配置项,设置 Seata 注册中心配置项,对应 RegistryProperties 类。

type 配置项,设置注册中心的类型,默认为 false。这里,我们设置为 nacos 来使用 Nacos 作为注册中心。

nacos 配置项就是设置 Nacos 注册中心的配置项。

工程

OrderController

@Slf4j
@RestController
@RequestMapping("/order")
public class OrderController {
    @Resource
    private OrderService orderService;
    @PostMapping("/create")
    public Integer createOrder(@RequestParam("userId") Long userId,
                               @RequestParam("productId") Long productId,
                               @RequestParam("price") Integer price) throws Exception {
        log.info("[createOrder] 收到下单请求,用户:{}, 商品:{}, 价格:{}", userId, productId, price);
        return orderService.createOrder(userId, productId, price);
    }
}

ProductController

@Slf4j
@RestController
@RequestMapping("/product")
public class ProductController {
    @Resource
    private ProductService productService;
    @PostMapping("/reduce-stock")
    public void reduceStock(@RequestBody ProductReduceStockDTO productReduceStockDTO)
            throws Exception {
        log.info("[reduceStock] 收到减少库存请求, 商品:{}, 价格:{}", productReduceStockDTO.getProductId(),
                productReduceStockDTO.getAmount());
        productService.reduceStock(productReduceStockDTO.getProductId(), productReduceStockDTO.getAmount());
    }
}

AccountController

@Slf4j
@RestController
@RequestMapping("/account")
public class AccountController {
    @Resource
    private AccountService accountService;
    @PostMapping("/reduce-balance")
    public void reduceBalance(@RequestBody AccountReduceBalanceDTO accountReduceBalanceDTO) throws Exception {
        log.info("[reduceBalance] 收到减少余额请求, 用户:{}, 金额:{}", accountReduceBalanceDTO.getUserId(),
                accountReduceBalanceDTO.getPrice());
        accountService.reduceBalance(accountReduceBalanceDTO.getUserId(), accountReduceBalanceDTO.getPrice());
    }
}

在这里,OrderController 会调用 OrderService 进行下单,而 OrderService 会通过 OpenFeign 远程调用 Account 和 Product 服务进行扣减。

@Slf4j
@Service
public class OrderServiceImpl implements OrderService {

    @Resource
    private OrderDao orderDao;
    @Resource
    private AccountServiceFeignClient accountService;
    @Resource
    private ProductServiceFeignClient productService;

    @Override
    @GlobalTransactional // 声明全局事务
    public Integer createOrder(Long userId, Long productId, Integer price) {
        Integer amount = 1; // 购买数量
        log.info("[createOrder] 当前 XID: {}", RootContext.getXID());
        // 远程调用扣减库存
        productService.reduceStock(new ProductReduceStockDTO().setProductId(productId).setAmount(amount));
        // 远程调用扣减余额
        accountService.reduceBalance(new AccountReduceBalanceDTO().setUserId(userId).setPrice(price));
        // 保存订单
        OrderDO order = new OrderDO().setUserId(userId).setProductId(productId).setPayAmount(amount * price);
        orderDao.saveOrder(order);
        log.info("[createOrder] 保存订单: {}", order.getId());
        // 返回订单编号
        return order.getId();
    }
}

这里通过 OpenFeign 远程调用了 productService 和 accountService 进行减库存和减余额,如果这时候扣除余额远程调用失败,又或是扣除库存失败,都会抛出 Exception 异常,从而回滚 Seata 全局事务

远程调用 API


/**
 * `account-service` 服务的 Feign 客户端
 */
@FeignClient(name = "account-service")
public interface AccountServiceFeignClient {
    @PostMapping("/account/reduce-balance")
    void reduceBalance(@RequestBody AccountReduceBalanceDTO accountReduceBalanceDTO);
}

/**
 * `product-service` 服务的 Feign 客户端
 */
@FeignClient(name = "product-service")
public interface ProductServiceFeignClient {
    @PostMapping("/product/reduce-stock")
    void reduceStock(@RequestBody ProductReduceStockDTO productReduceStockDTO);
}

在全部调用成功后,调用 OrderDao 保存订单。至此,整个流程也就完成了。

简单测试

正常流程测试就不用说了,而现在主要是测试异常情况。可以将订单的金额给设置大一点,再进行测试。会发现库存进行了回滚。
在这里插入图片描述

TCC 模式

根据 AT 模式我们知道,一个分布式的全局事务,整体是 两阶段提交 的模型。全局事务是由若干分支事务组成的,分支事务要满足 两阶段提交 的模型要求,即需要每个分支事务都具备自己的:

一阶段 prepare 行为
二阶段 commit 或 rollback 行为
在这里插入图片描述
根据两阶段行为模式的不同,我们将分支事务划分为 Automatic (Branch) Transaction Mode 和 TCC (Branch) Transaction Mode

AT 模式基于 支持本地 ACID 事务 的关系型数据库:

一阶段 prepare 行为:在本地事务中,一并提交业务数据更新和相应回滚日志记录。
二阶段 commit 行为:马上成功结束,自动 异步批量清理回滚日志。
二阶段 rollback 行为:通过回滚日志,自动 生成补偿操作,完成数据回滚。

相应的,TCC 模式,不依赖于底层数据资源的事务支持:

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

所谓 TCC 模式,是指支持把 自定义 的分支事务纳入到全局事务的管理中。

Saga 模式

Saga 模式是 Seata 提供的长事务解决方案,在 Saga 模式中,业务流程中每个参与者都提交本地事务,当出现某一个参与者失败则补偿前面已经成功的参与者,一阶段正向服务和二阶段补偿服务都由业务开发实现。

在这里插入图片描述
Saga的实现:

基于状态机引擎的 Saga 实现:
目前 Seata 提供的 Saga 模式是基于状态机引擎来实现的,机制是:

  1. 通过状态图来定义服务调用的流程并生成 json 状态语言定义文件
  2. 状态图中一个节点可以是调用一个服务,节点可以配置它的补偿节点
  3. 状态图 json 由状态机引擎驱动执行,当出现异常时状态引擎反向执行已成功节点对应的补偿节点将事务回滚

注意: 异常发生时是否进行补偿也可由用户自定义决定

可以实现服务编排需求,支持单项选择、并发、子流程、参数转换、参数映射、服务执行状态判断、异常捕获等功能
在这里插入图片描述
具体参考 官方文档

XA 模式

在 Seata 定义的分布式事务框架内,利用事务资源(数据库、消息服务等)对 XA 协议的支持,以 XA 协议的机制来管理分支事务的一种事务模式。

  1. 执行阶段:
  • 可回滚:业务 SQL 操作放在 XA 分支中进行,由资源对 XA 协议的支持来保证 可回滚
  • 持久化:XA 分支完成后,执行 XA prepare,同样,由资源对 XA 协议的支持来保证 持久化(即,之后任何意外都不会造成无法回滚的情况)
  1. 完成阶段:
  • 分支提交:执行 XA 分支的 commit
  • 分支回滚:执行 XA 分支的 rollback

工作机制

XA 模式 运行在 Seata 定义的事务框架内:
在这里插入图片描述

  • 执行阶段(E xecute):XA start/XA end/XA prepare + SQL + 注册分支
  • 完成阶段(F inish):XA commit/XA rollback

具体参考 官方文档

springcloud Alibaba 踩坑记 seata 分布式事务问题分析 本文采用是springcloud alibaba的组件集成,适合刚入坑seata的小白 以一篇基础文章作为开始:使用 Seata 实现分布式事务 源码和配置文章已经说得很清楚了,这篇文章主要写seata一些容易被忽略的坑点 下载:seata-server 坑点一 如果你的项目采用是spring-cloud-alibaba-seata 0.9.0版本或以下的话,它集成了fescar-spring的0... 阅读详情

相关推荐

Spring Cloud Alibaba系列之分布式事务Seata

Spring Cloud Alibaba系列之分布式事务Seata。Seata是Alibaba开源的一款分布式事务解决方案框架,致力于提供简单易用,高性能的服务。Seata支持多种分布式事务解决方法,比如常见的TCC、XA、SAGA,同时还有独创的AT模式

Nicky's blog 2856

微服务组件Seata

事务简介 ​ 事务(Transaction)是访问并可能更新数据库中各种数据项的一个程序执行单元(unit)。在关系数据库中,一个事务由一组SQL语句组成。事务应该具有4个属性:原子性、一致性、隔离性、持久性。 这四个属性通常称为ACID特性。 ​ 原子性(atomicity):个事务是一个不可分割的工作单位,事务中包括的诸操作要么都做,要么都不做。 ​ 一致性(consistency):事务必须是使数据库从一个一致性状态变到另一个一致性状态,事务的中间状态不能被观察到的。 ​

qq_43663493的博客 1148

【SpringCloud】Spring cloud Alibaba seata 分布式事务

1.概述 官网:http://seata.io/zh-cn/ 术语官网:http://seata.io/zh-cn/docs/overview/terminology.html 分布式全局事务ID 加上下面的三个术语 架构图 TM向TC申请开启一 个全局事务,全局事务创建成功并生成一 个全局唯一 的XID; XID在微服务调用链路的上下文中传播; RM向TC注册分支事务,将其纳入XID对应全局事务的管辖; TM向TC发起针对XID的全局提交或回滚决议; TC调度XID下管辖的全部分支事务完成提交或回.

九师兄 258

阿里巴巴中间件之Seata

一、在了解Seata之前先简单看一下两阶段提交 1.准备阶段 事务协调者(事务管理器)给每个参与者(资源管理器)发送 Prepare消息,每个参与者要么直接返回失败(如权限验证失败),要么在本地执行事务,写本地的redo和undo日志,但不提交。(关于每一个参与者在准备阶段具体做了什么目前 我还没有参考到确切的资料,但是有一点非常确定:参与者在准备阶段完 成了几乎所有正式提交的动作,有的材料上说是进行了“试探性的提 交”,只保留了最后一步耗时非常短暂的正式提交操作给第二阶段执行。) 2.提交阶段 如果协

weixin_44963129的博客 2432

(九)SpringCloud Alibaba - 分布式事务Seata

SpringCloud Alibaba - 分布式事务Seata Seata官网地址: https://seata.io/zh-cn/docs/user/quickstart.html 下载安装Seata 下载地址: https://github.com/seata/seata/releases 上传linux服务器,解压 tar -xf seata-server-1.4.2.tar.gz 切换到bin目录,启动seate [root@ocrdev seata]# cd /usr/wx/sprin..

专搞技术的小兔子 347

springCloud/Alibaba常用中间件之Seata分布式事务

在开始介绍之前先声明一下,seata的AT模式使用起来并不难,甚至只需要添加一个注释即可,但是在面试中seata的AT模式会问一些关于概念性的东西所以这里详细的介绍一下,若是你只想要知道如何使用直接向下看到Seata-AT模式使用在Seata中四种模式下都会有的三个核心组件TC(Transaction Coordinator[事务协调器]):负责全局事务的提交和回滚TM(Transaction Manage[事务管理]):定义事务的边界(如),事务的发起者。

weixin_68576312的博客 1410

SpringCloud Alibaba微服务 -- Seata的原理和使用

摸了两天鱼总结的分布式事务 seata 的相关原理和使用,绝对史诗级详细,绝对全网最保姆,还没有学习seata的同学快来看看吧~

知道的越多 不知道的就越多 5711

深入GSConv代码:逐行解析这个混合了标准卷积与深度可分离卷积的‘新算子’

本文深入解析GSConv代码,详细介绍了这个混合标准卷积与深度可分离卷积的‘新算子’的设计哲学与实现框架。通过PyTorch代码逐行分析,揭示GSConv如何在轻量级卷积神经网络中平衡计算效率与特征表达能力,特别适用于Slim-Neck架构,显著降低计算量同时保持高精度。

weixin_29860267的博客 321

SpringCloud Alibaba-Seata分布式事务

2PC是一个强一致性的同步阻塞协议,事务执⾏过程中需要将所需资源全部锁定,也就是俗称的 刚性事务。

沉浸式Study 2088

NVIDIA Jetson AGX Xavier设置风扇转速、工作模式及性能监控

Xavier的风扇在开机之后是默认关闭的,每次重启都需要手动打开风扇,后续可能考虑修改bashrc文件进行自动开启 这个是显示当前风扇的转速,默认应该是0,表示关闭,最大是250 cat /sys/devices/pwm-fan/target_pwm 可以通过修改该文件的值来修改风扇转速 vim /sys/devices/pwm-fan/target_pwm 我一般使用的是100这个值 作者:ryan_ren 链接:https://www.jianshu.com/p/d3c2041f7f7d 来源:简书 著

weixin_43877080的博客 1万+

STM32F407 步进电机S形曲线加减速

步进电机

smallerlang的博客 1590

SpringCloud Alibaba之Seata分布式事务学习笔记

Gitee仓库、Github仓库博客目录索引(持续更新)SpringCloud 教程 已完结(IDEA 2022.1最新版)4K蓝光画质 微服务开发PS:本章节中部分图片是直接引用学习课程课件,如有侵权,请联系删除。、、。SpringCloud Alibaba为我们提供了用于处理分布式事务的组件Seata。Seata 是一款开源的分布式事务解决方案,致力于提供高性能和简单易用的分布式事务服务。Seata 将为用户提供了 AT、TCC、SAGA 和 XA 事务模式,为用户打造一站式的分布式解决方案。...

每个人都是独一无二的,把握好自己的节奏,跟着自己的心走。 836

Ruoyi-Cloud集成Seata2.0实现分布式事务

在网络上,关于Spring Cloud和Ruoyi-Cloud整合Seata的教程有很多,针对不同版本的 Seata 也有不少相关教程。事实上,无论是 Spring Cloud 还是 Ruoyi-Cloud,其整合 Seata 的原理基本相同。这篇博文将详细介绍如何在本地开发环境下,在中实现Seata 2.0的整合,希望能为大家在分布式项目中实现 Seata 的整合提供实用的帮助,提供一个清晰的操作思路。

SR003的博客 2245

32.SpringCloud Alibaba Seata 分布式事务解决方案

从spring-cloud-alibaba官网,文档中Spring Cloud Alibaba also provide rich examples.点示例进入github地址:https://github.com/apache/incubator-seata官网地址:https://seata.apache.org/zh-cn/docs/overview/what-is-seata/让我们想象一个传统的整体式应用程序。它的业务由 3 个模块组成。它们使用单个本地数据源。关系型数据库,ACID。本地事务将保

RubyWinner的博客 1002

评价模型——层次分析法(AHP)与熵权法(EWM)

层次分析法是定性与定量结合的多准则决策、评价方法。将决策的有关元素分解成目标层、准则层和方案层,并通过人们的判断对决策方案的优劣进行排序,在此基础上进行定性和定量分析。它把人的思维过程层次化、数量化,并用数学为分析、决策、评价、预报和控制提供定量的依据。

好好学习 天天向上 2万+

串行通信原理及实验仿真

1. 处理器与外部设备通信的两种方式: 并行通信和串行通信 并行通信是指数据的各个位用多条数据线同时进行传输 优点:传输速度快 缺点:占用引脚资源多 串行通信是将数据分成一位一位的形式在一条传输线上逐个传输 优点:通信线路简单,占用引脚资源少 缺点:传输速度慢 2. 串行通信的通信方式: 同步通信和异步通信 同步通信:带有时钟同步信号的数据传输;发送方和接收方在同一时钟的控制下,同步传输数据。 异步通信:不同时钟同步信号的数据传输。发送方和接收方使用各自的时钟控制数据的发送和接收过程。 3. 串行通

gemengxia的博客 4322

SpringCloud Alibaba Seata 分布式事务处理的详细使用以及详细剖析

分布式微服务架构下的全局数据一致性问题 [即: 分布式事务问题]——> 解决方案: SeataSpringCloud Alibaba Seata 官方地址:http://seata.io/zh-cn/SpringCloud Alibaba Seata 官方使用手册: https://seata.io/zh-cn/docs/overview/what-is-seata.htmlSeata 是什么?Seata 是一款开源的分布式事务解决方案,致力于提供高性能和简单易用的分布式事务服务。

kfashfasf的博客 1135

科研党必备:用MATLAB批量处理.mat文件数据的3种高效方法

本文为科研人员提供了使用MATLAB批量处理.mat文件数据的三种高效方法,涵盖智能数据加载、专业可视化与自动化报告生成。通过构建自动化框架、多维度数据画图策略及批量处理流程,帮助用户显著提升数据处理效率与图表专业性,解决海量实验数据的管理与分析难题。

weixin_29089057的博客 70

Seata:Spring Cloud Alibaba分布式事务组件(非常详细)

服务启动时,从配置文件中获取服务分组的名称;从配置中心,通过事务分组名获取 TC 集群名;根据 TC 群组名以及其他信息构建服务名,获取真实的 TC 服务列表。

了解➔熟悉➔掌握➔精通 5817

【福建dem】原始高程数据tif格式

DEM(Digital Elevation Model,数字高程模型)是一种地理信息系统中的关键数据集,它提供了地表地形的三维信息,通常用于分析地貌特征、模拟水文过程、规划建设、灾害预警等多个领域。这种数据对于地理分析非常有价值,例如,它可以用于计算坡度、坡向、地形粗糙度等地形特征,或者进行洪水模拟、地质灾害评估、太阳能辐射分析等。“福建dem原始高程数据tif格式”是研究和理解福建省地形地貌的重要资源,结合GIS工具,可以揭示丰富的地理信息,为科研、工程和决策提供有力支持。

鸿业远图科技 943

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

Spring Cloud Alibaba 实战:轻松搞定 Seata 分布式事务治理

Seata(Simple Extensible Autonomous Transaction Architecture)是一个开源的分布式事务解决方案,提供了 AT(自动补偿事务)、TCC(Try-Confirm-Cancel)、SAGA(长事务)、XA(两阶段提交)等多种事务模式。

遇见伯灵说的博客 1064

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

SpringCloud Hoxton版 + SpringCloud alibaba学习笔记(14)-- SpringCloud Alibaba Seata处理分布式事务

上一篇:SpringCloud Hoxton版 + SpringCloud alibaba学习笔记(11)-- SpringCloud Alibaba Sentinel实现熔断与限流 一、分布式事务问题 1、分布式前 单机单库没这个问题,从1:1 -> 1:N -> N: N 2、分布式之后 3、一句话 一次业务操作需要跨多个数据源或需要跨多个系统进行远程调用,就会产生分布式事务问题 二、Seata简介 1、是什么 Seata是一款开源的分布式事务解决方案,致力于在微服务架构下提供高性能和简

exodus3的博客 1万+

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

SpringCloud Alibaba 微服务架构(十三)- SpringCloud 整合Seata 解决分布式事务

在当下微服务架构比较火热时,新一代微服务解决方案Spring Cloud Alibaba提供的开源分布式事务解决框架Seata无疑成为了我们在解决分布式事务时的首要之选,前面两篇文章分别介绍了常见的分布式解决方案和成熟的框架以及关于Seata概念的入门介绍

Thinkingcao的专栏 3944

SpringCloud-Alibaba之分布式事务Seata

SpringCloud-Alibaba之分布式事务Seata Seata解决方案:https://blog.youkuaiyun.com/qq_31155349/article/details/108866650

山路曲折盘旋,但毕竟朝着顶峰延伸 579

【Spring Cloud】17.SpringCloud Alibaba Seata处理分布式事务

1.简介 1.1 了解 官方:http://seata.io/zh-cn/ 一次业务操作需要跨多个数据源或需要跨多个系统进行远程调用,就会产生分布式事务问题 就是一次大型操作由不同的小型操作组成,这些小型操作分布在不同的服务器上,且属于不同的应用,分布式事务需要保证这些小型操作要么全部成功,要么全部失败。本质上来说,分布式事务就是为了保证不同数据库的数据一致性。 Seata是一款开源的分布式事务解决方案,致力于在微服务架构下提供高性能和简单易用的分布式事务服务。 一个典型的分布式事务过程: Tran

qq_44859586的博客 1866

SpringCloud Alibaba Seata处理分布式事务

SpringCloud Alibaba Seata处理分布式事务 一、分布式事务问题 ① 分布式前 ​ 单机单库没这个问题 从 1: 1 -> 1:N -> N: N ② 分布式之后 ​ 单体应用被拆分成微服务应用, 原来的三个模块被拆分成三个独立的应用,分别使用三个独立的数据源。 ​ 业务操作需要调用三个服务来完成。 此时每个服务内部的数据一致性由本地事务来保证, 但是全局的数据一致性问题没法保证。 ③ 一句话 ​ 一次业务操作需要跨多个数据源或需要跨多个系统进行远程调用, 就会产生分布

OY 549
上一篇: Nacos 注册中心与配置中心
下一篇: SpringCloud MQ
RedRay0
博客等级 码龄2年 120粉丝 11原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值