Seata

2023-05-16

Seata–微服务分布式事务组件

一、什么是分布式事务

1.什么是事务

事务指的是一个操作单元,在这个操作单元中的所有操作最终要保持一致的行为,要么所有操作都成功,要么所有的操作都被撤销。

2.本地事务

本地事务是指基于关系型数据库的事务,也称为传统事务。大多数场景下,我们的应用都只需要提供单一的数据库,这种情况下的事务称之为本地事务。本地事务的ACID特性是数据库直接提供。

使用@Transational声明事务

3.分布式事务

分布式事务指事务的参与者、支持事务的服务器、资源服务器以及事务管理器分别位于不同的分布式系统的不同节点之上。简单的说,就是一次大的操作由不同的小操作组成,这些小的操作分布在不同的服务器上,且属于不同的应用,分布式事务需要保证这些小操作要么全部成功,要么全部失败。

比如:

下面的两种情况,一种是同一个事务用到两个数据库,一个是同一个事务中的操作在不同的微服务上,可能使用同一个数据库,也可能用两个数据库。

在这里插入图片描述

在这里插入图片描述

二、微服务分布式事务组件–Seata

1、Seata是什么

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

官网:https://seata.io/zh-cn/

2、分布式事务提交协议

2.1两阶段提交(2PC)

两阶段提交又称2PC(two-phase commit protocol),2pc是一个非常经典的强一致、中心化的原子提交协议。这里所说的中心化是指协议中有两类节点:一个是中心化协调者节点(coordinator)和N个参与者节点(partcipant)。

阶段1:预处理阶段/请求阶段

1.询问 协调者向所有参与者发送事务请求,询问是否可以执行事务操作,然后等待各个参与者的响应。

2 执行 各个参与者接收到协调者事务请求后,执行事务操作,并将Undo和Redo信息记录到事务日志中。

3 响应 如果参与者成功执行了事务并写入了Undo和Redo信息,则向协调者返回YES响应,否则返回NO响应。当然,参与者也可能宕机,从而不能返回响应。

阶段2:提交回滚阶段/执行阶段

1.Commit/rollback请求, 在该阶段,协调者将基于第一个阶段的投票结果进行决策:提交或取消。 当且仅当所有的参与者同意提交事务协调者才通知所有的参与者提交事务,否则协调者将通知所有的参与者取消事务。

2 事务提交 参与者收到Commit或者rollback请求,执行事务提交或回滚操作,完成后释放事务执行期占用的所有资源。

3 反馈结果 参与者执行事务提交后向协调者发送Ask响应

4 完成事务 协调者接收到所有参与者的Ack响应后,完成事务提交。

在这里插入图片描述

2pc会遇到的问题:

1.同步阻塞 在两阶段提交的执行过程中,所有的参与者操作的逻辑都是处于阻塞状态,各个参与者在等待其他参与者响应的过程中,将无法进行其他任何操作。coordinator如果在发起提议后宕机,那么participant将进入阻塞(block)状态、一直等待coordinator回应以完成该次决议。

2.单点问题。协调者会有单点问题

3.数据不一致。网络原因或者其他原因会导致部分commit部分没有执行commit,产生数据不一致。

4.太过保守。就是说在两阶段中,任意一个节点的失败都会导致整个事物失败。

2.2 三阶段提交(3PC)

三阶段提交协议在协调者和参与者中都引入超时机制,并且把两阶段提交协议的第一个阶段拆分成了两步:询问,然后再锁资源,最后真正提交。形成canCOmmit、PreCommit、和doCommit三个阶段组成的事物处理协议。

3、Seata事务模式

seata提供了4种事务模式(AT、TCC、Saga、XA )的分布式事务实现。

其中AT模式是阿里首推的模式。

3.1 AT模式

AT(Auto Transaction)模式是一种对业务无侵入的分布式事务解决方案。是一种改进后的二阶段提交。

在AT模式下,用户只需关注自己的“业务SQL”,用户的“业务SQL”作为一阶段,Seata框架会自动生成事务的二阶段进行提交和回滚操作。

在这里插入图片描述

AT模式如何做到对业务的无侵入:

一阶段:

在第一阶段,Seata会拦截"业务SQL",首先解析SQL语义,找到”业务SQL“要更新的业务数据,在业务数据被更新前,将其保存成”before image“,然后执行”业务SQL"更新业务数据,在业务数据更新之后,再将其保存成“after image”,最后生成行所。以上操作全部在一个数据库事务中完成,这就保证了一阶段操作的原子性。

在这里插入图片描述

二阶段:

二阶段如果是提交的话,因为“业务SQL”在一阶段已经提交至数据库,所以Seata框架只需将一阶段保存的快照数据和行所删除,完成数据清理即可。

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

二阶段如果是回滚的话,Seata就需要回滚一阶段已经执行的业务SQL,还原业务数据。回滚方式便是用"before image"还原业务数据;但在还原前要首先要校验脏写,对比"数据库当前业务数据"和"after image",如果两份数据完全一致就说明没有脏写,可以还原业务数据,如果不一致就说明有脏写,出现脏写就需要转人工处理。

3.2 TCC模式

TCC 与 Seata AT 事务一样都是两阶段事务,它与 AT 事务的主要区别为:

  • TCC 对业务代码侵入严重
    每个阶段的数据操作都要自己进行编码来实现,事务框架无法自动处理。

  • TCC效率更高

    不必对数据加全局锁,允许多个事务同时操作数据。

    在这里插入图片描述

第一阶段 Try

以账户服务为例,当下订单时要扣减用户账户金额:

假如用户购买 100 元商品,要扣减 100 元。

TCC 事务首先对这100元的扣减金额进行预留,或者说是先冻结这100元:

第二阶段 Confirm

如果第一阶段能够顺利完成,那么说明“扣减金额”业务(分支事务)最终肯定是可以成功的。当全局事务提交时, TC会控制当前分支事务进行提交,如果提交失败,TC 会反复尝试,直到提交成功为止。

当全局事务提交时,就可以使用冻结的金额来最终实现业务数据操作。

第二阶段 Cancel

如果全局事务回滚,就把冻结的金额进行解冻,恢复到以前的状态,TC 会控制当前分支事务回滚,如果回滚失败,TC 会反复尝试,直到回滚完成为止。

4、Seata的三大角色

TC 事务协调者

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

TM 事务管理器

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

RM 资源管理器

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

其中,TC为单独部署的Server服务器,TM和RM为嵌入到应用中的Client客户端。

三、Seata的使用

db+nacos的方式部署高可用集群模式

1、Seata Server (TC) 环境搭建

1.1 下载

Server端:存储模式(store.mode)支持三种:

file: 单机模式,全局事务会话信息内存中读写并持久化本地文件root.data,性能较高(默认)

db:高可用模式,全局事务会话信息通过db共享,相应性能差些

redis: Seata-Server 1.3及以上版本支持,性能较高,存在事务信息丢失风险,请提前配置适合当前场景的redis持久化配置。

我们这里配置db模式。

版本关系

在这里插入图片描述

下载地址:

https://github.com/seata/seata/releases

1.2 配置DB

1.修改file.conf文件

设置mode为db

在这里插入图片描述

设置数据库连接信息

在这里插入图片描述

2.创建数据库

找到数据库文件

https://seata.io/zh-cn/docs/ops/deploy-guide-beginner.html

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

复制Sql信息到数据库里执行

在这里插入图片描述

1.3整合Nacos

整合Nacos作为Seata的注册配置中心。

1.修改registry.conf文件

在这里插入图片描述

在这里插入图片描述

2.修改config.txt文件

下载seata源码包

在这里插入图片描述

将里面的script文件夹复制到seata目录下

修改config-center里面的config.txt文件

在这里插入图片描述

在这里插入图片描述

3.执行nacos-config.sh文件

先安装git工具,下载地址:https://git-scm.com/download/win

然后启动nacos服务器

再双击执行nacos-config.sh文件

在这里插入图片描述

执行完以后,就可以看到nacos服务器上多了很多配置文件

在这里插入图片描述

4.启动 seata-server

windows下双击执行 seata-server.bat

在这里插入图片描述

2、准备分布式事务代码

在这里插入图片描述

2.1 创建springboot父工程

pom文件:

<dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-dependencies</artifactId>
                <version>2020.0.1</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>

            <dependency>
                <groupId>com.alibaba.cloud</groupId>
                <artifactId>spring-cloud-alibaba-dependencies</artifactId>
                <version>2021.1</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>

        </dependencies>
</dependencyManagement>

2.2 创建微服务order

1.pom文件
<dependencies>

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

    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
    </dependency>

    <dependency>
        <groupId>org.projectlombok</groupId>
        <artifactId>lombok</artifactId>
    </dependency>

    <dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-starter-openfeign</artifactId>
    </dependency>

    <dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-starter-loadbalancer</artifactId>
    </dependency>

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

    <dependency>
        <groupId>org.mybatis.spring.boot</groupId>
        <artifactId>mybatis-spring-boot-starter</artifactId>
        <version>2.2.2</version>
    </dependency>

    <dependency>
        <groupId>mysql</groupId>
        <artifactId>mysql-connector-java</artifactId>
    </dependency>

</dependencies>
<build>
    <resources>
        <resource>
            <directory>src/main/java</directory>
            <includes>
                <include>**/*.xml</include>
            </includes>
        </resource>
        <resource>
            <directory>src/main/resources</directory>
        </resource>
    </resources>
</build>

2.配置文件
spring:
  datasource:
    driver-class-name: com.mysql.jdbc.Driver
    url: jdbc:mysql://localhost:3306/db_orders?characterEncoding=utf8&serverTimezone=GMT%2B8
    username: root
    password: root
  cloud:
    nacos:
      discovery:
        server-addr: http://localhost:8848
    loadbalancer:
      ribbon:
        enabled: false
  application:
    name: ORDER
mybatis:
  type-aliases-package: com.test.pojo
server:
  port: 8081

3.入口类
@SpringBootApplication
@MapperScan(basePackages = "com.test.mapper")
@EnableDiscoveryClient
@EnableFeignClients
public class OrderServiceApplication {

    public static void main(String[] args) {
        SpringApplication.run(OrderServiceApplication.class,args);
    }
}
4.pojo层
@Data
@AllArgsConstructor
@NoArgsConstructor
public class Orders {

    private int id;
    private int pid;
    private int state;

}

5.mapper层
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd" >
<mapper namespace="com.test.mapper.OrdersMapper">
    <insert id="addOrder" parameterType="Orders">
        insert into orders values(null,#{pid},#{state})
    </insert>
</mapper>
package com.test.mapper;

import com.test.pojo.Orders;

public interface OrdersMapper {

    public int addOrder(Orders orders);
}

6.service层
package com.test.service.impl;

import com.test.client.StockClient;
import com.test.mapper.OrdersMapper;
import com.test.pojo.Orders;
import com.test.service.IOrdersService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

@Service
public class OrdersService implements IOrdersService {

    @Autowired
    private StockClient stockClient;

    @Autowired
    private OrdersMapper ordersMapper;

    @Override
    public void addOrder(Orders orders)
    {
        ordersMapper.addOrder(orders);

        stockClient.updateStock(orders.getPid());


    }
}
7.整合Load Balance
package com.test.config;

import org.springframework.cloud.client.loadbalancer.LoadBalanced;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.client.RestTemplate;

@Configuration
public class RemoteConfig {

    @Bean
    @LoadBalanced
    public RestTemplate restTemplate()
    {
        return new RestTemplate();
    }
}

8.整合openfeign
package com.test.client;

import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RequestParam;

@FeignClient("STOCK")
public interface StockClient {
    @RequestMapping(value = "/updateStock",method = RequestMethod.GET)
    public int updateStock(@RequestParam("pid") int pid);
}

9.controller层
package com.test.controller;

import com.test.pojo.Orders;
import com.test.service.IOrdersService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class OrdersController {

    @Autowired
    private IOrdersService ordersService;

    @GetMapping("/orders")
    public void addOrder()
    {
        Orders orders=new Orders();
        orders.setPid(1);
        orders.setState(1);

        ordersService.addOrder(orders);
    }
}

2.3 创建微服务stock

1.pom文件
 <dependencies>
        
        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>

        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
        </dependency>

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

        <dependency>
            <groupId>org.mybatis.spring.boot</groupId>
            <artifactId>mybatis-spring-boot-starter</artifactId>
            <version>2.2.2</version>
        </dependency>

        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
        </dependency>

    </dependencies>


    <build>
        <resources>
            <resource>
                <directory>src/main/java</directory>
                <includes>
                    <include>**/*.xml</include>
                </includes>
            </resource>
            <resource>
                <directory>src/main/resources</directory>
            </resource>
        </resources>
    </build>

2.配置文件
spring:
  datasource:
    driver-class-name: com.mysql.jdbc.Driver
    url: jdbc:mysql://localhost:3306/db_stock?characterEncoding=utf8&serverTimezone=GMT%2B8
    username: root
    password: root
  cloud:
    nacos:
      discovery:
        server-addr: http://localhost:8848
  application:
    name: STOCK
mybatis:
  type-aliases-package: com.test.pojo
server:
  port: 8082

3.入口类
package com.test;

import org.mybatis.spring.annotation.MapperScan;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication
@MapperScan(basePackages = "com.test.mapper")
public class StockServiceApplication {

    public static void main(String[] args) {
        SpringApplication.run(StockServiceApplication.class,args);
    }
}

4.pojo层
@Data
@NoArgsConstructor
@AllArgsConstructor
public class Stock {

    private int id;
    private int pid;
    private int num;
}
5.mapper层
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd" >
<mapper namespace="com.test.mapper.StockMapper">

    <update id="updateStock" parameterType="int" >
        update stock set num=num-1 where pid=#{pid}
    </update>

</mapper>
package com.test.mapper;

public interface StockMapper {

    public int updateStock(int pid);
}
6.service层
package com.test.service.impl;

import com.test.mapper.StockMapper;
import com.test.service.IStockService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

@Service
public class StockService  implements IStockService {

    @Autowired
    private StockMapper stockMapper;

    @Override
    public int updateStock(int pid) {
        return stockMapper.updateStock(pid);
    }
}
7.controller层
package com.test.controller;

import com.test.service.IStockService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class StockController {

     @Autowired
     private IStockService stockService;

     @GetMapping("/updateStock")
     public int updateStock(int pid)
     {
          return stockService.updateStock(pid);
     }
}

3、搭建Seata Client(TM,RM)

3.1添加seata依赖

order和stock服务中都添加

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

3.2创建undo_log表

在order和stock数据库中都添加

CREATE TABLE IF NOT EXISTS `undo_log`
(
    `id`  BIGINT(20) NOT NULL PRIMARY KEY AUTO_INCREMENT,
    `branch_id`     BIGINT       NOT NULL COMMENT 'branch transaction id',
    `xid`           VARCHAR(128) NOT NULL COMMENT 'global transaction id',
    `context`       VARCHAR(128) 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 KEY `ux_undo_log` (`xid`, `branch_id`)
) ENGINE = InnoDB
  AUTO_INCREMENT = 1
  DEFAULT CHARSET = utf8 COMMENT ='AT transaction mode undo table';

3.3 配置事务分组

在order和stock服务中都加

spring.cloud.alibaba.seata.tx-service-group: shanghai

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

3.4 配置seata的注册中心和配置中心

目的是告诉seata client 怎么去访问seata-server

在order和stock服务中都加

seata:
  registry:
    type: nacos
    nacos:
      server-addr: http://localhost:8848
      application: seata-server
      username: nacos
      password: nacos
      group: SEATA_GROUP
  config:
    type: nacos
    nacos:
      server-addr: http://localhost:8848
      username: nacos
      password: nacos
      group: SEATA_GROUP

3.5 在业务逻辑方法中添加@GlobalTransactional

在这里插入图片描述

3.6测试

重启两个服务,可以发现出错后,回滚了。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Seata 的相关文章

  • Caused by: java.lang.NoClassDefFoundError: io/seata/spring/annotation/datasource/SeataDataSourceBean

    在使用Spring Boot整合Seata实现分布式事务的时候报了这个错 当时在pom xml引入的spring cloud alibaba dependencies依赖包是2 2 2 RELEASE lt dependency gt lt
  • Seata(一) 服务配置以及启动

    文章目录 Seata 介绍Seata 简介Seata 演进历史Seata 设计理念Seata 的三大组件seata 实现的 2PC 与传统 2PC 的区别 Seata Server 安装Seata Server 下载Seata Server
  • Windows下Seata配置启动

    此为个人笔记 xff0c 看了网上其他人的配置 xff0c 仅仅用于记录 1 首先需要下载安装包与源码 xff0c 俩者版本需一致 https github com seata seata releases 2 创建一个seata 数据库
  • SpringCloud:seata 服务端启动以及介绍(1)

    SpringCloud xff1a seata 服务端启动以及介绍 文章目录 SpringCloud xff1a seata 服务端启动以及介绍关联文章1 seata是什么1 1 四种事务模式1 2 三种角色 2 启动seata 服务端 x
  • Windows下seata报错为can not register RM,err:can not connect to services-server的解决办法,亲测有效。

    nacoc下的服务 xff1a 点开seata的TC服务看一下里面的地址 xff0c 左下角为你该服务的ip地址 上图我的ip地址是我目前在用的校园网地址也就是你的桌面右下角的网络地址 我之前报错的原因呢是因为他这里的默认的ip是我之前虚拟
  • Seata详解(一)

    分布式事务 事务是数据库的概念 xff0c 数据库事务 xff08 ACID xff1a 原子性 一致性 隔离性和持久性 xff09 xff1b 分布式事务的产生 xff0c 是由于数据库的拆分和分布式架构 微服务 带来的 xff0c 在常
  • Interview preparation -- spring cloud seata

    分布式事务 事物ACID特性 A Atomic 原子性 构成事物的所有操作 要么全部成功 要么全部失败 不存在部分成功或失败情况 C Conststency 一致性 在事物完成时候 所有数据必须保持一致 I Isolation 隔离性 并发
  • docker配置seata分布式事务并注册至nacos

    Docker配置分布式事务Seata并注册到Nacos服务中心 Docker常用基础命令 docker ps 查询当前服务器的服务 docker images 查看服务下载的镜像 docker ps a 查看所有的服务 包含未开启的服务 d
  • 老板现在喊我大哥,原因是我用阿里分布式事务框架Seata解决了长久以来困扰公司的分布式事务问题

    大家好 我是曹尼玛 从大学毕业5年 一直努力学习 努力工作 追求新技术 不保守 上个月我来到一家新公司上班 月薪20K 这家公司老板人很好 对员工很关爱 公司氛围不错 同事们也努力把公司项目搞搞好 除了那个混日子的10年开发经验的老王 老板
  • 分布式事务:解决方案之2PC实战

    说完 分布式事务 解决方案之2PC理论 我们现在就要在理论的基础上实践一把 1 业务说明 下面我们通过Seata中间件实现分布式事务来模拟两个账户的转账交易过程 交易过程是 张三给李四转账指定金额 2 开发环境 数据库 MySQL 5 6
  • Seata 多路服务调用时事务不回滚解决办法

    最近使用了Seata作为分布式事务管理工具 在一般情况如 A服务调用B服务且A服务调用C服务 即A B A C这种服务调用链路 当其中任意一个服务报错 事务是可以回滚的 然而 稍微复杂一点的情况我发现seata事务居然不会回滚了 即A B
  • 【Seata】03 - Seata AT 模式全局锁相关知识简单整理

    文章目录 前言 参考目录 版本说明 分析整理 1 全局锁的引入说明 2 全局锁相关源码整理 2 1 流程简图 2 2 事务分支注册前的 SQL 相关操作 2 3 注册分支 获取全局锁 前言 上一篇文章介绍了 AT 模式的调用流程 但是有个比
  • 分布式事务:解决方案之2PC理论

    现在我们了解了 分布式事务 三个概念 和 分布式事务 两个理论 以这些为基础 针对不同的分布式场景 业界常见的有四大解决方案 2PC TCC 可靠消息最终一致性 最大努力通知 今天我们先说说2PC这个解决方案 1 什么是2PC 2PC即两阶
  • 阿里开源一站式分布式事务框架seata源码分析(AT模式下TC分析)

    DefaultCoordinator1 seata Server分析 TC源码分析 在seata tc服务的启动的时候都是通过它提供的启动脚本来启动 对于seata Server的入口分析 也是启动脚本就可以看出 如下我截最后执行命令 才下
  • DOCKER安装SEATA注册到NACOS

    因为总是多多少少的会出现问题 所以我自行搭建成功 跳过所有坑之后写了个博客 此处没有使用集群 说明 请创建对应seata所需的数据库 将seata源码中的sql执行进去 1 使用最新的seata和nacos以及mysql5 7版本 基于ce
  • SpringCloudAlibaba - Seata (1) 各模式详解、微服务集成、集群搭建

    文章目录 分布式事务模型 Seata 架构 部署 TC 服务 微服务集成 Seata XA 模式 Seata 实现的 XA 模式 XA 模式的具体实践 AT 模式 AT 模式与 XA 模式最大的区别 AT 模式下的脏写问题 AT 模式的具体
  • seata server 1.6版本安装及配置

    文章目录 下载 安装并启动 数据库 导入数据库 修改配置文件 服务注册 配置中心 手动添加 脚本导入 前些天发现了一个巨牛的人工智能学习网站 通俗易懂 风趣幽默 忍不住分享一下给大家 点击跳转到网站 Seata 是一款开源的分布式事务解决方
  • 【Seata】00 - Seata Server 部署(Windows、Docker 基于 Jpom)

    文章目录 前言 参考目录 版本说明 Windows 部署 seata server 1 下载压缩包 2 文件存储模式 3 db 存储模式 3 1 建表 3 2 修改配置文件 3 3 启动脚本 4 源码部署 Docker 部署 seata s
  • 阿里分布式事务框架-seata源码分析

    详细可参考 AT下流程图 TCC下流程图 基于该流程图可大致了解seata中TC TM RM这3个角色在seata框架中的作用 以及两种模式的优缺点
  • Seata: 运行nacos-config.sh报Please check the cluster status的总结

    一 看所在的机器是否安装了curl并正常工作 二 检查nacos是否能正常访问 三 看如下命令结果是否异常 根据实际情况调整nacos地址 curl X POST http 127 0 0 1 8848 nacos v1 cs config

随机推荐

  • delete 和 delete[]真正区别

    我们通常从教科书上看到这样的说明 xff1a delete 释放new分配的单个对象指针指向的内存 delete 释放new分配的对象数组指针指向的内存 那么 xff0c 按照教科书的理解 xff0c 我们看下下面的代码 xff1a spa
  • Activity的onNewIntent

    一个应用的Activity可供多种方式调用启动 xff0c 当多个调用希望只有一个Activity的实例存在 xff0c 并且还要区分是被谁启动或是已经启动被谁拉到前台来的 xff0c 这就需要Activity的onNewIntent In
  • at 与 crontab调度命令详解

    目录 1 At调度 只执行一次 1 1准备任务 xff1a 查看at服务是否开启 1 2绝对时间定制任务 1 3相对时间定制任务 1 4查看at进程 1 5删除at任务 2 crontab调度 可重复执行 2 1简述 2 2crontab调
  • [计算机网络] --- STP (下篇) 工作原理及配置

    文章目录 前言一 stp工作原理二 stp计算过程 工作步骤1 选举根桥2 选举根端口3 选举指定端口4 确立阻塞端口 三 例题 xff1a 前言 上一篇文章我们介绍了stp的起源和一些相关术语 xff0c 接下来我们就正式开始介绍stp的
  • iOS富文本实现(一):私密阅读效果

    废话不多说 xff0c 咱们直接先看效果 xff01 看是不是咱想要的哈 目录 xff1a 一 前言 xff1a 二 核心需求说明 三 实现效果核心代码片段 四 几个注意的小细节 一 前言 xff1a 我的第一篇CSDN文章就这样发布了 x
  • 登录 注册 servlet基础

    工具类 页面与数据库的交换 span class token keyword package span org span class token punctuation span lizhenhua span class token pun
  • 解决Ubuntu开机之后不显示桌面图标,只显示桌面文件的问题

    Ubuntu开机之后不显示桌面图标 xff08 指左侧那一栏 xff09 xff0c 但桌面上的文件可以使用 xff0c 鼠标可以使用 鼠标右键 gt 打开终端 xff1b xff08 如果鼠标不能使用 xff0c 按ctl 43 alt
  • yii2中登录后跳转回登录前请求的页面

    yii2中登录后跳转回登录前请求的页面 作者 php 发布时间 2017 06 16 浏览 1030次 转发请备注原文地址 xff1a www niwoxuexi com blog php article 158 html yii2中登录后
  • Gateway

    Gateway SpringCloud微服务网关组件 一 Spring Cloud Gateway简介 1 为什么要用Gateway xff1f 在微服务架构中 xff0c 通常一个系统会被拆分为多个微服务 xff0c 微服务之间的调用可以
  • Android(安卓)时间戳和日期之间的转化

    注 xff1a 转发请注明原地址 xff1a https www niwoxuexi com blog android article 170 在Android开发过程中 xff0c 经常会遇到日期的各种格式转换 xff0c 主要使用Sim
  • 如何判断Activity是否在前台显示

    转发请备注原文地址 xff1a https www niwoxuexi com blog android00 article 223 html 我们在Android开发过程中 xff0c 经常会判断Activity是否在前台显示 xff0c
  • Android 获取cache缓存的目录路径

    转发请备注原文地址 xff1a https www niwoxuexi com blog android00 article 224 html Android开发中 xff0c 有时需要知道cache缓存的路径 我写了一个静态类 xff0c
  • objc[8715]: Class JavaLaunchHelper is implemented in both...

    在Mac上 xff0c 升级IntelliJ Idea 2017 01后 xff0c 运行的时候出现了一个红色的警告 xff1a objc 8715 Class JavaLaunchHelper is implemented in both
  • mac上使用dex2jar遇到的权限问题的解决

    本文来自 xff1a https www niwoxuexi com blog android article 235 html 摘要 在dex2jar目录下执行sudo sh d2j dex2jar sh classes dex时报错如下
  • Android Studio将module变为library

    本文来源你我学习网 xff1a 地址 https www niwoxuexi com blog android article 244 html 我们在开发的时候如在在Android Studio中的module打包成library方便模块
  • Navicat Premium实现mysql数据库备份/还原

    转发请备注原文地址 xff1a https www niwoxuexi com blog php article 161 htm Navicat Premium 是一个非常好用的数据库 xff08 支持 MySQL SQLite Oracl
  • 在vue中获取dom元素

    转发请备注原文链接地址 xff1a https www niwoxuexi com blog web article 307 html 在vue中经常会通过js操作dom对象 xff0c 可以通过给标签添加ref属性实现 xff0c 下面通
  • HIVE总结

    一 xff1a hive作用 Hive是基于Hadoop的一个数据仓库工具 xff0c 可以将结构化的数据文件映射为一张表 xff0c 并提供类SQL 查询功能 Hive本质 xff1a 将HQL转化成MapReduce程序 xff08 1
  • 微软2014校园招聘笔试题

  • Seata

    Seata 微服务分布式事务组件 一 什么是分布式事务 1 什么是事务 事务指的是一个操作单元 xff0c 在这个操作单元中的所有操作最终要保持一致的行为 xff0c 要么所有操作都成功 xff0c 要么所有的操作都被撤销 2 本地事务 本