SpringCloud Alibaba Seata处理分布式事务与执行原理

分析国外几款主流蜜罐产品看欺骗诱捕技术的应用脉络 网络安全的本质是攻防对抗,更本质的其实是人与人心智与技术的全面较量。 欺骗诱捕技术作为攻防对抗技术中比较特殊的技术,能够使防守方更多掌握对抗中的主动权,诱导攻击,迫使攻击者耗费精力的同时,留下丰富的攻击信息。究其本质,欺骗诱捕技术更深层次考验的不止是技术的能力,还有对于攻击者作为人的理解。 国外主流蜜罐产品分析 根据MarketsandMarkets《欺骗技术市场规模、份额和2021年全球市场预测》中提到的欺骗诱捕技术全球主要供应商及产品,我们分析了几款国外主流的蜜罐产品,希望更清晰看到欺骗诱捕技术应 阅读详情

Seata处理分布式事务

分布式问题的出现

出现分不是之前 :单机单库没这个问题
出现分布式之后
在这里插入图片描述
我们分开的模块,原来模块都有独立的数据源,那么我如何保证一致性呢?
一次业务操作需要跨多个数据源或需要跨多个系统进行远程调用,就会产生分布式事务问题
这个时候就需要一套解决方案,那么 seata 营运而生

Seata简介

Seata是一款开源的分布式事务解决方案,致力于在微服务架构下提供高性能和简单易用的分布式事务服务
官网地址 :http://seata.io/zh-cn/
下载地址 :https://github.com/seata/seata/releases

Seata能给我们带来什么

先介绍一下 seata 的三个核心组件和一个全局id

  • 全局唯一的事务ID 当开启事务就会生成xid,凭借这个id来标识是哪个事务

三个组件

  • Transaction Coordinator(TC) :事务协调器,维护全局事务的运行状态,负责协调并驱动全局事务的提交或回滚;
  • Transaction Manager™ : 控制全局事务的边界,负责开启一个全局事务,并最终发起全局提交或全局回滚的决议;
  • Resource Manager(RM) : 控制分支事务,负责分支注册,状态汇报,并接收事务协调器的指令,驱动分支(本地)事务的提交和回滚;

举个例子 : 一个典型的分布式事务过程

  • TM向TC申请开启一个全局事务,
  • 全局事务创建成功并生成一个全局唯一的XID;XID在微服务调用链路的上下文中传播;
  • RM向TC注册分支事务,将其纳入XID对应全局事务的管辖;
  • TM向TC发起针对XID的全局提交或回滚决议;
  • TC调度XID下管辖的全部分支事务完成提交或回滚请求。
    在这里插入图片描述

seata 安装和配置

我们首先需要有的环境

  • java 8
  • mysql
    演示版本为 0.9 版本, 1.0之后有变化,有升级需求查看官方文档升级

下载完成之后,进入到config文件夹中

在这里插入图片描述
我们可以创建副本吗,避免修改玩坏了,
这里我们配置 file 先
找到 service 模块 自定义名字

vgroup_mapping.fsp_tx_group = “default”

store模块

mode = “db”
url = “jdbc:mysql://127.0.0.1:3306/seata”
user = “root”
password = “你自己的密码”

配置玩之后,我们去配置 registry.conf,配置自己nacos的相关信息

registry { # file 、nacos 、eureka、redis、zk、consul、etcd3、sofa
type = “nacos”
nacos {
serverAddr = “localhost:8848”
namespace = “”
cluster = “default”
}

之后去 数据库中 导入 seata的数据库脚本
在这里插入图片描述
启动即可

演示示例

准备环境

创建三个库

  • seata_order: 存储订单的数据库
  • seata_storage:存储库存的数据库
  • seata_account: 存储账户信息的数据库

建库sql

CREATE DATABASE seata_order;
 
CREATE DATABASE seata_storage;
 
CREATE DATABASE seata_account;

seata_order库下建t_order表

CREATE TABLE t_order(
    `id` BIGINT(11) NOT NULL AUTO_INCREMENT PRIMARY KEY,
    `user_id` BIGINT(11) DEFAULT NULL COMMENT '用户id',
    `product_id` BIGINT(11) DEFAULT NULL COMMENT '产品id',
    `count` INT(11) DEFAULT NULL COMMENT '数量',
    `money` DECIMAL(11,0) DEFAULT NULL COMMENT '金额',
    `status` INT(1) DEFAULT NULL COMMENT '订单状态:0:创建中; 1:已完结'
) ENGINE=INNODB AUTO_INCREMENT=7 DEFAULT CHARSET=utf8;
 
SELECT * FROM t_order;

seata_storage库下建t_storage表

CREATE TABLE t_storage(
    `id` BIGINT(11) NOT NULL AUTO_INCREMENT PRIMARY KEY,
    `product_id` BIGINT(11) DEFAULT NULL COMMENT '产品id',
    `total` INT(11) DEFAULT NULL COMMENT '总库存',
    `used` INT(11) DEFAULT NULL COMMENT '已用库存',
    `residue` INT(11) DEFAULT NULL COMMENT '剩余库存'
) ENGINE=INNODB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8;
 
INSERT INTO seata_storage.t_storage(`id`,`product_id`,`total`,`used`,`residue`)
VALUES('1','1','100','0','100');
 
 
SELECT * FROM t_storage;

seata_account库下建t_account表

CREATE TABLE t_account(
    `id` BIGINT(11) NOT NULL AUTO_INCREMENT PRIMARY KEY COMMENT 'id',
    `user_id` BIGINT(11) DEFAULT NULL COMMENT '用户id',
    `total` DECIMAL(10,0) DEFAULT NULL COMMENT '总额度',
    `used` DECIMAL(10,0) DEFAULT NULL COMMENT '已用余额',
    `residue` DECIMAL(10,0) DEFAULT '0' COMMENT '剩余可用额度'
) ENGINE=INNODB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8;
 
INSERT INTO seata_account.t_account(`id`,`user_id`,`total`,`used`,`residue`) VALUES('1','1','1000','0','1000')
 
 
 
SELECT * FROM t_account;

之后在三个数据库 创建 undo_log表

drop table `undo_log`;
CREATE TABLE `undo_log` (
  `id` bigint(20) NOT NULL AUTO_INCREMENT,
  `branch_id` bigint(20) NOT NULL,
  `xid` varchar(100) NOT NULL,
  `context` varchar(128) NOT NULL,
  `rollback_info` longblob NOT NULL,
  `log_status` int(11) NOT NULL,
  `log_created` datetime NOT NULL,
  `log_modified` datetime NOT NULL,
  `ext` varchar(100) DEFAULT NULL,
  PRIMARY KEY (`id`),
  UNIQUE KEY `ux_undo_log` (`xid`,`branch_id`)
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8;

最终效果
在这里插入图片描述

之后构建三个模块

新建订单Order-Module

引入依赖

 
    <dependencies>
        <!--nacos-->
        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
        </dependency>
        <!--seata-->
        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-seata</artifactId>
            <exclusions>
                <exclusion>
                    <artifactId>seata-all</artifactId>
                    <groupId>io.seata</groupId>
                </exclusion>
            </exclusions>
        </dependency>
        <dependency>
            <groupId>io.seata</groupId>
            <artifactId>seata-all</artifactId>
            <version>0.9.0</version>
        </dependency>
        <!--feign-->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-openfeign</artifactId>
        </dependency>
        <!--web-actuator-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-actuator</artifactId>
        </dependency>
        <!--mysql-druid-->
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>5.1.37</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.0.0</version>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <optional>true</optional>
        </dependency>
    </dependencies>

配置文件

server:
  port: 2001
 
spring:
  application:
    name: seata-order-service
  cloud:
    alibaba:
      seata:
        #自定义事务组名称需要与seata-server中的对应
        tx-service-group: fsp_tx_group
    nacos:
      discovery:
        server-addr: localhost:8848
  datasource:
    driver-class-name: com.mysql.jdbc.Driver
    url: jdbc:mysql://localhost:3306/seata_order
    username: root
    password: 1111111
 
feign:
  hystrix:
    enabled: false
 
logging:
  level:
    io:
      seata: info
 
mybatis:
  mapperLocations: classpath:mapper/*.xml

之后将 .file.conf和registry.conf两个文件放入到项目resource文件夹中
创建实体类
这里业务类我们使用的是 openfeign来作为调用的组件

  • OrderService
public interface OrderService{
    void create(Order order);
}
 

实现类
这里我们使用
@GlobalTransactional(name = "fsp-create-order",rollbackFor = Exception.class)开启全局注解

name是我们的事务名字
之后回掉方法是异常class


@Service
@Slf4j
public class OrderServiceImpl implements OrderService
{
    @Resource
    private OrderDao orderDao;
    @Resource
    private StorageService storageService;
    @Resource
    private AccountService accountService;
 
    /**
     * 创建订单->调用库存服务扣减库存->调用账户服务扣减账户余额->修改订单状态
     */
     
    @Override
    @GlobalTransactional(name = "fsp-create-order",rollbackFor = Exception.class)
    public void create(Order order){
        log.info("----->开始新建订单");
        //新建订单
        orderDao.create(order);
 
        //扣减库存
        log.info("----->订单微服务开始调用库存,做扣减Count");
        storageService.decrease(order.getProductId(),order.getCount());
        log.info("----->订单微服务开始调用库存,做扣减end");
 
        //扣减账户
        log.info("----->订单微服务开始调用账户,做扣减Money");
        accountService.decrease(order.getUserId(),order.getMoney());
        log.info("----->订单微服务开始调用账户,做扣减end");
 
         
        //修改订单状态,从零到1代表已经完成
        log.info("----->修改订单状态开始");
        orderDao.update(order.getUserId(),0);
        log.info("----->修改订单状态结束");
 
        log.info("----->下订单结束了");
 
    }
}
 

  • StorageService

@FeignClient(value = "seata-storage-service")
public interface StorageService{
   @PostMapping(value = "/storage/decrease")
   CommonResult decrease(@RequestParam("productId") Long productId, @RequestParam("count") Integer count);
}


  • AccountService
@FeignClient(value = "seata-account-service")
public interface AccountService{
   @PostMapping(value = "/account/decrease")
   CommonResult decrease(@RequestParam("userId") Long userId, @RequestParam("money") BigDecimal money);
}

  • MyBatisConfig
 
@Configuration
@MapperScan({"com.atguigu.springcloud.alibaba.dao"})
public class MyBatisConfig {
}
 
  • DataSourceProxyConfig(配置seata的代理,)
@Configuration
public class DataSourceProxyConfig {
 
    @Value("${mybatis.mapperLocations}")
    private String mapperLocations;
 
    @Bean
    @ConfigurationProperties(prefix = "spring.datasource")
    public DataSource druidDataSource(){
        return new DruidDataSource();
    }
 
    @Bean
    public DataSourceProxy dataSourceProxy(DataSource dataSource) {
        return new DataSourceProxy(dataSource);
    }
 
    @Bean
    public SqlSessionFactory sqlSessionFactoryBean(DataSourceProxy dataSourceProxy) throws Exception {
        SqlSessionFactoryBean sqlSessionFactoryBean = new SqlSessionFactoryBean();
        sqlSessionFactoryBean.setDataSource(dataSourceProxy);
        sqlSessionFactoryBean.setMapperLocations(new PathMatchingResourcePatternResolver().getResources(mapperLocations));
        sqlSessionFactoryBean.setTransactionFactory(new SpringManagedTransactionFactory());
        return sqlSessionFactoryBean.getObject();
    }
 
}

新建库存Storage-Module

pom基本一致,就不重复复制了,直接上配置

server:
  port: 2002
 
spring:
  application:
    name: seata-storage-service
  cloud:
    alibaba:
      seata:
        tx-service-group: fsp_tx_group
    nacos:
      discovery:
        server-addr: localhost:8848
  datasource:
    driver-class-name: com.mysql.jdbc.Driver
    url: jdbc:mysql://localhost:3306/seata_storage
    username: root
    password: 111111
 
logging:
  level:
    io:
      seata: info
 
mybatis:
  mapperLocations: classpath:mapper/*.xml
 
 
 

之后将 .file.conf和registry.conf两个文件放入到项目resource文件夹中
这里就略过实体类了,直接实现类,主要感受seata带来的事务

@Service
public class StorageServiceImpl implements StorageService {
 
    private static final Logger LOGGER = LoggerFactory.getLogger(StorageServiceImpl.class);
 
    @Resource
    private StorageDao storageDao;
 
     // 扣减库存
    @Override
    public void decrease(Long productId, Integer count) {
        LOGGER.info("------->storage-service中扣减库存开始");
        storageDao.decrease(productId,count);
        LOGGER.info("------->storage-service中扣减库存结束");
    }
}
 

如下两个配置与模块一一致

  • MyBatisConfig
  • DataSourceProxyConfig

新建账户Account-Module

配置文件

server:
  port: 2003
 
spring:
  application:
    name: seata-account-service
  cloud:
    alibaba:
      seata:
        tx-service-group: fsp_tx_group
    nacos:
      discovery:
        server-addr: localhost:8848
  datasource:
    driver-class-name: com.mysql.jdbc.Driver
    url: jdbc:mysql://localhost:3306/seata_account
    username: root
    password: 1111111
 
feign:
  hystrix:
    enabled: false
 
logging:
  level:
    io:
      seata: info
 
mybatis:
  mapperLocations: classpath:mapper/*.xml
 

之后将 .file.conf和registry.conf两个文件放入到项目resource文件夹中

实现类

/**
 * 账户业务实现类
 */
@Service
public class AccountServiceImpl implements AccountService {
 
    private static final Logger LOGGER = LoggerFactory.getLogger(AccountServiceImpl.class);
 
 
    @Resource
    AccountDao accountDao;
 
    /**
     * 扣减账户余额
     */
    @Override
    public void decrease(Long userId, BigDecimal money) {
        
         LOGGER.info("------->account-service中扣减账户余额开始");
        try { TimeUnit.SECONDS.sleep(20); } catch (InterruptedException e) { e.printStackTrace(); }
        accountDao.decrease(userId,money);
        LOGGER.info("------->account-service中扣减账户余额结束");
    }
}
 

这里我们设置超时,之后去创建订单,看看是否成功

http://localhost:2001/order/create?userId=1&productId=1&count=10&money=100
我们会发现,数据库没变化,出现超时异常,立刻就回滚了

当我们把超时代码注释,再次创建订单,数据库的值就变化了
在这里插入图片描述
只是配置了一下,添加了个全局事务注解,就可以实现分布式事务了,这其中seata做了什么呢?

seata原理

分布式事务的执行流程

  • TM开启分布式事务(TM向TC注册全局事务记录)
  • 换业务场景,编排数据库,服务等事务内资源(RM向TC汇报资源准备状态)
  • TM结束分布式事务,事务一阶段结束(TM通知TC提交/回滚分布式事务)
  • TC汇总事务信息,决定分布式事务是提交还是回滚
  • TC通知所有RM提交/回滚资源,事务二阶段结束。

在这里插入图片描述

seata的几种模式

AT模式如何做到对业务的无侵入
在这里插入图片描述
在这里插入图片描述

一阶段

在一阶段,Seata 会拦截“业务SQL”,

  1. 解析SQL语义,找到“业务SQL”要更新的业务数据,在业务数据被更新前,将其保存成“before image’
  2. 执行“业务SQL”更新业务数据,在业务数据更新之后,
  3. 其保存成“after image”,最后生成行锁。

以上操作全部在一个数据库事务内完成,这样保证了一阶段操作的原子性。
在这里插入图片描述

二阶段

提交

在这里插入图片描述

回滚

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

完整过程流程图

在这里插入图片描述

总结

seata分布式事务解决方案,我们微服务的事务发生了质变,原本只有单机和单数据源,开启事务
而多个数据源多个模块的事务开启,seata回去寻找在一个事务里的数据源,拦截sql去做一系列的处理
解决了单机单数据源一致性的业务痛点。 一个字 猛!

基于RK3562J开发板的MCP2518FD CAN-FD控制器驱动适配与测试指南 本文详细介绍了在RK3562J开发板上适配MCP2518FD CAN-FD控制器驱动的完整流程。内容涵盖内核驱动配置、设备树修改、编译烧录以及实际通信测试,重点分享了调试方法,旨在帮助开发者快速为嵌入式系统扩展高速CAN-FD通信能力,适用于汽车电子、工业控制等场景。 阅读详情

相关推荐

大白话,Android Studio安装及其资源分享(离线gradle配置)

安装AndroidAtudio,并通过aliClound镜像与离线gradle配置,来跳过相对“繁文缛节”的过程,直接实现开发

wangzixuanemp的博客 3597

SpringCloud Alibaba学习(十二):Seata处理分布式事务(三万字提供 介绍、搭建、实战、原理一条龙服务)

Seata是一款开源的分布式事务解决方案,致力于在微服务架构下提供高性能和简单易用的分布式事务服务。

m0_49499183的博客 1421

电动汽车整车控制器 UDS诊断功能开发调试优化方法

摘要:通过某电动汽车VCU开发过程中,UDS诊断功能的调试,发现一些测试中存在的问题,比如覆盖度不够、效率低下等,提出了相应的优化方法,并经过测试验证其可行性,此方法亦可推广应用至BMS、HCM等其他控制器的UDS诊断开发调试过程中。希望能给相关技术人员带来参考和帮助。

qq_43011586的博客 2142

Spring Cloud Alibaba Seata (入门篇)

Seata 是一款开源的分布式事务解决方案,致力于在微服务架构下提供高性能和简单易用的分布式事务服务。

2301_76632762的博客 1541

如何从零开始写小程序

看了这篇文章,即使让我现在就从头写一个能够正常运行的小程序,也没有原本想象中的那么难了。 在本文中,我们将会以一个具体的小程序为例,带领大家从零到一完成一个小程序的开发流程,并将这个小程序上传到 FinClip.com 进行小程序提审与上架操作。 我们新建了一个叫做「HelloWorld」的小程序,FIDE 在初始化小程序项目时,会自动在项目目录中补充对应所需要的项目文件。那不妨让我们先从小程序目录下的配置文件开始,逐渐揭开小程序的面纱。 使用 FIDE 编辑小程序 1. 认识 json 文件 在小程序项目

POHOU23的博客 4394

BUCK电路为何无法实现100%占空比?自举电路原理与替代方案解析

在开关电源设计中,DC-DC转换器是实现电压变换的核心器件,其工作原理基于功率开关管的周期性导通与关断。BUCK(降压)电路作为一种经典拓扑,通过调节开关管的占空比来控制输出电压。然而,其占空比存在理论上限,无法达到100%,这一限制源于高边开关管的驱动需求。为了驱动高边N沟道MOSFET(NMOS),需要栅极电压高于源极电压,而自举(Bootstrap)电路通过利用开关节点电压的跳变,巧妙地生成了这一高压驱动信号。自举电路必须在每个开关周期内存在续流阶段(低边管导通)为电容充电,这从根本上限制了最大占空比

weixin_32239523的博客 307

SpringCloud Alibaba【微服务分布式组件---Seata】

目录6. Alibaba微服务分布式组件---Seata6.1 Seata 是什么2PC 两阶段提交协议(Two-Phase Commit)2PC 的问题6.2 4种模式的分布式事务实现(AT、TCC、Saga、XA)AT 模式(Auto)TCC 模式6.3 Seata---Seata的 AT 模式原理整体机制设计亮点存在问题6.4 Seata 快速开始6.5 Seata服务搭建---nacos启动Seata Server6.6 Seata---分布式事务搭建Seata Client 快速开始本地事务测试分

Vinjcent 1687

C2000 CLA协处理器:嵌入式实时控制性能优化与实战指南

在嵌入式实时控制系统中,主CPU常因高频率、低延迟的控制算法而面临性能瓶颈。为解决此问题,协处理器技术应运而生,它通过硬件并行架构分担计算密集型任务,从而提升系统整体性能。其核心原理在于独立的计算单元与总线设计,能够实现近乎零延迟的响应,这对于电机驱动、数字电源等闭环控制场景具有极高的技术价值。本文聚焦于德州仪器C2000系列微控制器中的控制律加速器(CLA),深入解析其作为独立浮点协处理器如何通过任务调度与消息RAM通信机制,有效实现性能倍增,并提供了从内存配置到代码调试的完整工程实践方案。

weixin_29192211的博客 302

面试官问我知道的分布式事务,我一口气说了六种

阿里面试官没想到我真的全都会...

敖丙 4万+

高效批量转换Java接口为MCP服务:降低重复劳动的实战指南

高效批量转换Java接口为MCP服务:降低重复劳动的实战指南

专注于编程、AI、人工智能等多个领域内容研究和分析 722

励磁电感 Lm 选对了,LLC 才真“高效”:半桥 LLC 效率优化

你有没有遇到过这种 LLC:参数一套下来,ZVS 也有了,波形看着也“挺谐振”,但一上功率——,效率就是死活上不去。我说句直白的:LLC 的“高效”,很大一部分其实是在背后控场。Lm 选小了,励磁电流蹭蹭涨,谐振电流 RMS 变大,导通损耗、开关损耗、整流损耗一起上天;Lm 选太大,又可能把 ZVS 的门槛抬高,轻载掉 ZVS,EMI 也开始作妖。

weixin_43199439的博客 434

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

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

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

cilium native-routing模式流程分析

本文分析cilium native routing模式下的报文路径和涉及到的ebpf源码分析。实验环境在vxlan模式下修改参数后而来。native routing和vxlan模式的区别主要是跨节点通信时,vxlan模式需要封装,native routing模式需要根据目的ip查找路由表转发到其他节点。

fengcai_ke的博客 987

spring cloud alibaba 完整实现(三)参数传递详解及seata执行过程

前言 这是spring cloud alibaba完整实现的第三章,在前面两章,我们已经将nacos,open feign,以及seata集成了。因为是以搭建环境为主,所以有很多代码写得相对比较简单,更多的是配置,那么实际使用的时候可能还是有很多疑问,这一章我就暂时把各类参数传递问题及seata执行时如何操作的进行记录与解释,方便使用,后续也是一样,一边集成各个组件,一边解决相关使用问题。 参数传递 上一章我们简单的添加用户及日志,参数传递并没有进行演示与说明,那么我们一起来看一下...

邋遢道的博客 703

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

锂电池充电器电路设计 里面有电路

锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。

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万+

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

SpringCloud Alibaba-Seata处理分布式事务

Seata是一款开源分布式事务解决方案,采用AT模式实现跨数据源的事务一致性。核心组件包括TC(事务协调器)、TM(事务管理器)和RM(资源管理器),通过XID全局事务ID实现调用链路的事务管理。

zl979899的博客 1295

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

SpringCloud Alibaba Seata处理分布式事务

一、分布式事务问题 1.1 分布式前 单机单库没这个问题 从1:1 -> 1:N -> N: N 1.2 分布式之后 一句话,一次业务操作需要跨多个数据源或需要跨多个系统进行远程调用,就会产生分布式事务问题。 二、Seata简介 2.1 是什么 Seata是一款开源的分布式事务解决方案,致力于在微服务架构下提供高性能和简单易用的分布式事务服务。 2.1.1 官网地址 http://seata.io/zh-cn/ 2.2 能干嘛 2.2.1 一个典型的分布式事务过程 .

Jak的博客 3404

SpringCloud Alibaba Seata 分布式事务

Seata 是一款开源的分布式事务解决方案,致力于提供高性能和简单易用的分布式事务服务。Seata 将为用户提供了 AT、TCC、SAGA 和 XA 事务模式,为用户打造一站式的分布式解决方案。分布式事务(Distributed Transaction)特指多个服务同时访问多个数据源的事务处理机制,分布式是相对于服务而言的,更严谨地说,应该被称为在分布式服务环境下的事务处理机制。一般的单体应用,如果使用多个数据源,才需要面临分布式事务的问题(要考虑多个数据源的一致性)。

RedRay0的博客 2064

SpringCloud Alibaba之Seata处理分布式事务

Seata是一款开源的分布式事务解决方案,致力于在微服务架构下提供高性能和简单易用的分布式事务服务。AT模式如何做到对业务的无侵入(事务尽量不要超过5个,容易出事故,3个一个事务提交,再组合)(1)一阶段加载在一阶段,Seata 会拦截“业务 SQL”,1 解析 SQL 语义,找到“业务 SQL”要更新的业务数据,在业务数据被更新前,将其保存成“before image”,2 执行“业务 SQL”更新业务数据,在业务数据更新之后,3 其保存成“after image”,最后生成行锁。

qq_36813853的博客 1439

【SpringCloud20】SpringCloud Alibaba Seata处理分布式事务

SpringCloud Alibaba Seata处理分布式事务

qq_45291280的博客 2397

SpringCloud Alibaba Seata 分布式事务 和 其 原理

学习建议去官网 官网:http://seata.io/zh-cn/ 分布式事务问题 单体应用被拆分为微服务应用,原来三个模块被拆分成三个独立的应用,分别使用3个独立的数据源, 业务操作需要调用三个服务来完成。此时每个服务内部数据一致性由本地事务来保证,但是全局的数据一致性问题没法保证 Seata 简介 官网:http://seata.io/zh-cn/ seata 是什么? Seata 是一款开源的分布式事务解决方案,致力于提供高性能和简单易用的分布式事务服务。Seata 将为用户提供了 AT、TCC、S

方亚军的博客 2930

SpringCloud Alibaba Seata (收藏版)

1,概念Seata是一款开源的分布式事务解决方案,致力于在微服务架构在提供高性能和简单一样的分布式事务服务。2,处理过程Transaction ID XID:全局唯一的事务IDTransaction Coordinator(TC) :维护全局和分支事务的状态,驱动全局事务提交或回滚。Transaction Manager™ :定义全局事务的范围:开始全局事务、提交或回滚全局事务。

sinat_53467514的博客 1298

【微服务架构】SpringCloud Alibaba(九):分布式事务Seata使用和源码分析(TCC模式、Saga模式)

TCC相关注解如下:@LocalTCC 适用于SpringCloud+Feign模式下的TCC,@LocalTCC一定需要注解在接口上,此接口可以是寻常的业务接口,只要实现了TCC的两阶段提交对应方法便可@TwoPhaseBusinessAction 注解try方法,其中name为当前tcc方法的bean名称,写方法名便可(全局唯一),commitMethod指向提交方法,rollbackMethod指向事务回滚方法。

专注上位机开发、机器视觉、机器学习、嵌入式软硬件开发 5万+

springcloud alibaba分布式事务解决方案及seata1.4实践

1.分布式事务的产生 事务是通过jdbc Connection对象进行开启,及提交/回滚,同jvm 使用@Transaction注解时,只要业务method没有结束,spring是不会退回connection到连接池的,但不同jvm是不是spring上下文来管理connection的(即不同本地事务)。微服务划分因尽量的高内聚低耦合,减少分布式事务,但是随着系统逐渐变得庞大,分布式事务也情况也会...

MJ的博客 6736

【SpringCloud Alibaba笔记】(4)Seata处理分布式事务

Seata 分布式事务问题 单机单库没这个问题,分布式之前从1: 1 -> 1:N ->N:N 分布式之后 单体应用被拆分成微服务应用,原来的三个模块被拆分成三个独立的应用分别使用三个独立的数据源,业务操作需要调用三个服务来完成。 此时每个服务内部的数据一致性由本地事务来保证,但是全局的数据一致健问题没法保证。 一句话:一次业务操作需要跨多个数据源或需要跨多个系统进行远程调用,就会产生分布式事务问题 Seata简介 是什么 Seata是一款开源的分布式事务解决方案,致力于在微服务架构下提供高性能

jinx 1215
上一篇: 2020-11-3面试总结
下一篇: Docker:十五分钟快速了解Docker快速部署nginx
冷环渊
博客等级 码龄7年 1130粉丝 176原创
评论 4
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

打赏作者

冷环渊

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

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

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

打赏作者

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

抵扣说明:

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

余额充值