zoukankan      html  css  js  c++  java
  • SpringCloud 解决分布式事务的两种方式

    本文来自于《精通Spring Cloud Alibaba》课程的整理,讲师为余胜军,点击查看视频内容
    本文系志愿者整理,供配合学习中心课程使用,不做商业用途。

    LCN官网基本介绍

    http://www.txlcn.org/zh-cn/ LCN并不生产事务,LCN只是本地事务的协调工

    LCN基本实现原理

    发起方与参与方都与我们的LCN管理器一直保持长连接;
    发起方在调用接口之前,先向LCN管理器申请一个全局的事务分组id;
    发起方调用接口的时候在请求头中传递事务分组id;
    参与方获取到请求头中有事务分组的id的,则当前业务逻辑执行完实现假关闭,不会提交或者回滚当前的事务。
    发起方调用完接口后,如果出现异常的情况下,在通知给事务协调者回滚事务,这时候事务协调则告诉给参与方回滚当前的事务。

    SpringBoot整合lcn5.0

    Maven依赖

    <dependency>
        <groupId>com.codingapi.txlcn</groupId>
        <artifactId>txlcn-tc</artifactId>
        <version>5.0.2.RELEASE</version>
    </dependency>
    <dependency>
        <groupId>com.codingapi.txlcn</groupId>
        <artifactId>txlcn-txmsg-netty</artifactId>
        <version>5.0.2.RELEASE</version>
    </dependency>
    

    相关配置

      application:
        ###服务的名称
        name: meitemayikt-order
      datasource:
        url: jdbc:mysql://localhost:3306/order?useUnicode=true&characterEncoding=UTF-8
        username: root
        password: root
        driver-class-name: com.mysql.jdbc.Driver
      cloud:
        nacos:
          discovery:
            ###nacos注册地址
            server-addr: 127.0.0.1:8848
        refresh:
          refreshable: none
    
    
    tx-lcn:
      client:
        manager-address: 127.0.0.1:8070
      logger:
        enabled: true
    

    用法

    参与方与发起方都要加上该注解
    @LcnTransaction
    @Transactional

    源码核心入口

    重新feign客户端拦截器 RequestInterceptor
    Aop的重学的入口TransactionAspect
    实现该接口可以在请求之前处理参数SpringTracingApplier
    http://127.0.0.1:8090/insertOrder?age=1

    1、Lcn如何判断自己是发起方还是参与方?
    根据当前的线程threadlocal中获取事务分组id,如果能够成功获取到则是为参与方,没有能够获取到就是为发起方。
    2、A调用B,B调用C 到底会生产几次事务id?

    A调用 B 调用C 调用D 只有全局的分组的id 都是有一个局部的事务id

    3、参与方如何从请求头中获取事务id?如何加入事务组中?
    4、LCN如何实现数据源代理实现假关闭?

    学习LCN源码分析的话 入口 @LcnTransaction 必须有AOP才能够对我们注解生效。

    TransactionAspectAop的入口类。

    深入了解seata解决分布式事务

    Seata简单介绍

    https://github.com/seata/seata
    https://seata.io/zh-cn/index.html

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

    Seata的实现原理

    Seata有3个基本组成部分:

    事务协调器(TC):维护全局事务和分支事务的状态,驱动全局提交或回滚。
    事务管理器TM:定义全局事务的范围:开始全局事务,提交或回滚全局事务。
    资源管理器(RM):管理分支事务正在处理的资源,与TC进行对话以注册分支事务并报告分支事务的状态,并驱动分支事务的提交或回滚。

     
     
  • 相关阅读:
    11 2
    10 29
    10 22
    dp的本质
    笛卡尔树小结
    Gitlab 备份迁移恢复报错gtar: .: Cannot mkdir: No such file or directory
    升级Jenkins版本
    当linux中的所有指令突然不能使用的时候
    合并范围
    每股收益列报计算
  • 原文地址:https://www.cnblogs.com/javalinux/p/14265406.html
Copyright © 2011-2022 走看看