精华内容
下载资源
问答
  • 修改LCN4.1.0源码的打成相关的jar包,完美解决LCN4.1.0不支持springBoot2.x的问题。以及修改后的源码
  • 基于springcloud2.0搭建lcn,里面有数据库,文档原理,还有原理分析,分布式事务应用场景,分布式事务解决方案
  • tx-manager.rar(lcn 分布式事务管理协调器)、用于管理事务
  • csdn,解决方案,事务控制原理和核心步骤这几个方面来阐述通过LCN来实现分布式事务。官方宣称:LCN并不生产事务,LCN只是本地事务的协调工。 TX-LCN定位于一款事务协调性框架,框架其本身并不操作事务,而是基于对...
  • 该资源包含LCN分布式介绍PPT、教学视频、项目整合demo等资源,对于想了解LCN框架的用户非常有用。
  • lcn版本:5.0.2 TX-LCN的核心控制流程(官网) 官网地址:https://www.codingapi.com/docs/txlcn-lesson02/ 首先创建数据表:t_tx_exception CREATE TABLE `t_tx_exception` ( `id` bigint(20) NOT NULL ...

    boot版本:2.0.6
    cloud版本:Finchley.SR2
    lcn版本:5.0.2

     

    TX-LCN的核心控制流程(官网)

    官网地址:https://www.codingapi.com/docs/txlcn-lesson02/

     

    首先创建数据表:t_tx_exception

    CREATE TABLE `t_tx_exception`  (
      `id` bigint(20) NOT NULL AUTO_INCREMENT,
      `group_id` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL,
      `unit_id` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL,
      `mod_id` varchar(128) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL,
      `transaction_state` tinyint(4) NULL DEFAULT NULL,
      `registrar` tinyint(4) NULL DEFAULT NULL,
      `remark` varchar(4096) NULL DEFAULT  NULL,
      `ex_state` tinyint(4) NULL DEFAULT NULL COMMENT '0 未解决 1已解决',
      `create_time` datetime NULL DEFAULT NULL,
      PRIMARY KEY (`id`) USING BTREE
    ) ENGINE = InnoDB AUTO_INCREMENT = 1 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci ROW_FORMAT = Dynamic;

    创建项目 yu-txlcn-tm,

    pom.xml

            <dependency>
                <groupId>com.codingapi.txlcn</groupId>
                <artifactId>txlcn-tm</artifactId>
                <version>5.0.2.RELEASE</version>
            </dependency>

    更新配置文件bootstrap.yml

    tx-lcn:
      client:
        manager-address: localhost:8070
      ribbon:
        loadbalancer:
          dtx:
            enabled: true
      logger:
        enabled: true
        driver-class-name: com.mysql.jdbc.Driver
        jdbc-url: jdbc:mysql://localhost:3306/yq?useUnicode=true&characterEncoding=UTF-8&useLegacyDatetimeCode=false&serverTimezone=Asia/Shanghai&useSSL=false&zeroDateTimeBehavior=convertToNull&allowMultiQueries=true
        username: root
        password: root

    yu-txlcn-tm 结构体

    application.properties

    spring.application.name=yu-txlcn-tm
    server.port=7970
    
    #JDBC 数据库配置
    spring.datasource.driver-class-name=com.mysql.jdbc.Driver
    spring.datasource.url=jdbc:mysql://localhost:3306/yq?useUnicode=true&characterEncoding=UTF-8&useLegacyDatetimeCode=false&serverTimezone=Asia/Shanghai&useSSL=false&zeroDateTimeBehavior=convertToNull&allowMultiQueries=true
    spring.datasource.username=root
    spring.datasource.password=root
    
    #数据库方言
    spring.jpa.database-platform=org.hibernate.dialect.MySQL5InnoDBDialect
    
    # 第一次运行可以设置为: create, 为TM创建持久化数据库表
    #spring.jpa.hibernate.ddl-auto=validate
    spring.jpa.hibernate.ddl-auto=update
    
    # TM监听IP. 默认为 127.0.0.1
    tx-lcn.manager.host=127.0.0.1
    
    # TM监听Socket端口. 默认为 ${server.port} - 100
    tx-lcn.manager.port=8070
    
    # 心跳检测时间(ms). 默认为 300000
    tx-lcn.manager.heart-time=300000
    
    #  分布式事务执行总时间(ms). 默认为36000
    tx-lcn.manager.dtx-time=8000
    
    # 参数延迟删除时间单位ms  默认为dtx-time值
    tx-lcn.message.netty.attr-delay-time=${tx-lcn.manager.dtx-time}
    
    # 事务处理并发等级. 默认为机器逻辑核心数5倍
    tx-lcn.manager.concurrent-level=160
    
    # TM后台登陆密码,默认值为codingapi
    tx-lcn.manager.admin-key=codingapi
    
    # 分布式事务锁超时时间 默认为-1,当-1时会用tx-lcn.manager.dtx-time的时间
    tx-lcn.manager.dtx-lock-time=${tx-lcn.manager.dtx-time}
    
    #  雪花算法的sequence位长度,默认为12位.
    tx-lcn.manager.seq-len=12
    
    # 异常回调开关。开启时请制定ex-url
    tx-lcn.manager.ex-url-enabled=false
    
    # 事务异常通知(任何http协议地址。未指定协议时,为TM提供内置功能接口)。默认是邮件通知
    tx-lcn.manager.ex-url=/provider/email-to/xxxxxx@qq.com
    
    
    
    # 开启日志,默认为false
    #tx-lcn.logger.enabled=true
    tx-lcn.logger.driver-class-name=${spring.datasource.driver-class-name}
    tx-lcn.logger.jdbc-url=${spring.datasource.url}
    tx-lcn.logger.username=${spring.datasource.username}
    tx-lcn.logger.password=${spring.datasource.password}
    
    #  redis 的设置信息. 线上请用Redis Cluster
    spring.redis.host=localhost
    spring.redis.port=6379
    spring.redis.password=redis

    使用之前的 yu-user-service 与 yu-third-service 测试

    pom.xml新增

            <!-- 分布式事物 开始 -->
            <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>
            <!-- 分布式事物 结束 -->

    修改启动类 及 调用接口(这里只用user服务做示范,third也需要添加注解的)

    /**
     * @author Yuqiang
     */
    @SpringBootApplication
    @EnableFeignClients(basePackages = "com.crayon.*") //激活feign
    @EnableCircuitBreaker//激活 hystrix
    @EnableDistributedTransaction//激活 分布式事务lcn
    public class YuUserServiceApplication {
    
        public static void main(String[] args) {
            SpringApplication.run(YuUserServiceApplication.class, args);
        }
    
    }

    调用接口

    //user服务
    
        @Override
        @LcnTransaction
        @Transactional
        public Message insertName(String name) {
            Message  message =userInvokeService.getUser("嗯嗯");
            log.info("调用third:  ", message.toString());
            UserModel userModel = new UserModel();
            userModel.setMobile("13071813602");
            userModel.setName("小强");
            int count = userDao.insertUser(userModel);
            log.info("count: " + count);
            int a = 1/0;//故意出错
            return new Message("成功", ErrorType.SUCCESS);
        }
    
    //third服务
        @Override
        @LcnTransaction
        @Transactional
        public int insertThirdRecord(ThirdRecordModel model) {
            return thirdRecordDao.insertThirdRecord(model);
        }

    //测试事务  user,third 都插入完数据后 user异常了

    user模块

    third模块

    但是 数据库 并没有插入数据 ---> 表示事务已生效(回滚数据)

     

    PS:

     @LcnTransaction,这个注解会导致数据库连接被分布式事物接管,进而导致连接延迟释放,接口响应时间变长,所以使用时请注意

     

     

    展开全文
  • LCN 分布式事务框架

    千次阅读 2019-01-15 18:29:09
    锁定事务单元(lock)、确认事务模块状态(confirm)、通知事务( notify ) 2、LCN 框架相关资料 tx-lcn 官方地址:https://www.txlcn.org/ tx-lcn Github地址:https://github.com/codingapi...

    1、LCN 框架的由来

    在设计框架之初的1.0 ~ 2.0的版本时,框架设计的步骤是如下的,各取其首字母得来的LCN命名:

    • 锁定事务单元(lock
    • 确认事务模块状态(confirm)
    • 通知事务( notify )

    2、LCN 框架相关资料

    tx-lcn 官方地址:https://www.txlcn.org/
    tx-lcn Github地址:https://github.com/codingapi/tx-lcn
    tx-lcn 服务下载地址:https://pan.baidu.com/s/1cLKAeE#list/path=%2F
    tx-lcn 服务源码地址:https://github.com/codingapi/tx-lcn/tree/master/tx-manager

    3、LCN 框架核心执行步骤

    创建事务组:
    是指在事务发起方开始执行业务代码之前先调用 TxManager 创建事务组对象,然后拿到事务标示GroupId的过程。

    添加事务组:
    添加事务组是指参与方在执行完业务方法以后,将该模块的事务信息添加通知给 TxManager 的操作。

    关闭事务组:
    是指在发起方执行完业务代码以后,将发起方执行结果状态通知给 TxManager 的动作。当执行完关闭事务组的方法以后, TxManager 将根据事务组信息来通知相应的参与模块提交或回滚事务。

    4、LCN应用

    4.1、搭建 tx-manager 服务

    LCN 是通过一个独立的微服务 tx-manager 作为分布式事务控制服务端(事务协调器)。需要执行分布式事务控制的微服务应用都通过远程服务调用的方式,在 tx-manager 上标记事务组,在执行事务处理后,将本地事务状态发送到 tx-manager 中对应的事务组上,tx-manager 会根据具体的状态来通知相应的微服务应用提交或回滚。

    tx-manager 也是使用 Spring Cloud 开发的一个微服务应用,在搭建过程上是非常简单的。
    下载 tx-manager 事务协调器zip压缩包:
    https://pan.baidu.com/s/1cLKAeE#list/path=%2F

    压缩包解压后内容如下:
    在这里插入图片描述

    修改 application.properties 配置文件,提供本地微服务应用的 Eureka 注册中心配置、redis配置。其中redis是事务协调器在处理事务组时使用的临时存储。

    ##########################txmanager-start#######################
    #服务端口
    server.port=8899
    
    #tx-manager不得修改
    spring.application.name=tx-manager
    
    spring.mvc.static-path-pattern=/**
    spring.resources.static-locations=classpath:/static/
    ###########################txmanager-end#######################
    
    #eureka 地址
    eureka.client.service-url.defaultZone=http://127.0.0.1:8761/eureka/
    eureka.instance.prefer-ip-address=true
    
    #############################redis-start#########################
    ##redis 单点环境配置
    #redis
    spring.redis.database=0
    spring.redis.timeout=0
    spring.redis.host=192.168.1.136
    spring.redis.port=6379
    spring.redis.pool.max-active=100
    spring.redis.pool.max-wait=3000
    spring.redis.pool.max-idle=200
    spring.redis.pool.min-idle=50
    spring.redis.pool.timeout=600
    ##############################redis-end##########################
    
    ###############################LCN-start########################
    tm.transaction.netty.delaytime = 5
    tm.transaction.netty.hearttime = 15
    tm.redis.savemaxtime=30
    tm.socket.port=9999
    tm.socket.maxconnection=100
    tm.compensate.auto=false
    tm.compensate.notifyUrl=http://ip:port/path
    tm.compensate.tryTime=30
    tm.compensate.maxWaitTime=5000
    
    logging.level.com.codingapi=debug
    

    将修改后的 application.properties 配置文件打包到 tx-manager-x.x.x.jar 中,替代jar中原有的默认配置文件。

    使用命令: java -jar tx-manager-x.x.x.jar 启动微服务。
    测试tx-manager事务协调器是否启动成功可以访问 http://ip:8899/ 。如下结果代表事务协调器启动成功:

    在这里插入图片描述

    4.2、在微服务中使用LCN实现分布式事务管理

    在所有需要处理分布式事务的微服务中增加下述依赖:为统一资源版本,使用 properties 统一管理版本信息。

    <properties>
    	<lcn.last.version>4.1.0</lcn.last.version>
    </properties>
    
    <dependencies>
    
    	<dependency>
    		<groupId>com.codingapi</groupId>
    		<artifactId>transaction-springcloud</artifactId>
    		<version>${lcn.last.version}</version>
    		<exclusions>
    			<exclusion>
    				<groupId>org.slf4j</groupId>
    				<artifactId>*</artifactId>
    			</exclusion>
    		</exclusions>
    	</dependency>
    
    	<dependency>
    		<groupId>com.codingapi</groupId>
    		<artifactId>tx-plugins-db</artifactId>
    		<version>${lcn.last.version}</version>
    		<exclusions>
    			<exclusion>
    				<groupId>org.slf4j</groupId>
    				<artifactId>*</artifactId>
    			</exclusion>
    		</exclusions>
    	</dependency>
    
    </dependencies>
    

    在全局配置文件中增加下述配置:

    # 定义事务协调器所在位置。根据具体环境定义其中的IP地址和端口。
    tm.manager.url=http://127.0.0.1:8899/tx/manager/
    

    使用LCN做分布式事务管理时,微服务应用内必须提供一个用于获取 txUrl( txUrl就是全局配置文件中定义的 tm.manager.url )的类型实现,这个类可以使用独立应用定义,在微服务应用中引入。

    本案例中为了方便,直接在所有的微服务应用中提供对应代码实现。具体如下:

    @Service
    public class TxManagerTxUrlServiceImpl implements TxManagerTxUrlService {
    
    	@Value("${tm.manager.url}")
    	private String url;
    
    	@Override
    	public String getTxUrl() {
    		return url;
    	}
    }
    

    在分布式事务管理代码中增加注解 @TxTransaction 。在业务调用方增加的注解需要属性isStart=true 。而被调用方则不需要定义任何的注解属性。

    如:交易服务调用了订单服务,那么交易服务中代码:

    @TxTransaction(isStart=true)
    @Transactional
    public void trade() {
        //本地调用
        tradeDao.save();
        //远程调用方
        orderService.order();
    }
    

    订单服务中代码:

    @Transactional
    @TxTransaction
    public void order() {
        //本地调用
        orderDao.save();
    }
    
    展开全文
  • 本文来自于csdn,本章首先介绍3.0与4.0之前的差异,其次介绍了LCN4.0的原理,最后进行模拟场景演示,希望本文可以为您的学习带来收获。1、地址:2、4.0添加升级如下功能:(1)3.0虽然有事务补偿机制,但4.0在此基础...
  • LCN-分布式事务配置

    2018-10-10 11:39:36
    springboot-dubbo 使用LCN分布式事务控制, 此文件有详细的配置方式
  • LCN分布式事务框架

    千次阅读 2020-04-23 12:34:00
    LCN是国产开源的分布式事务处理框架。LCN即:lock(锁定事务单元)、confirm(确认事务模块状态)、notify(通知事务)。 官网:http://www.txlcn.org/zh-cn/ 2.首先介绍3.0与4.0之前的差异 2.1.地址 2.2.添加升级...

    1.LCN是什么

    LCN是国产开源的分布式事务处理框架。LCN即:lock(锁定事务单元)、confirm(确认事务模块状态)、notify(通知事务)。

    官网:http://www.txlcn.org/zh-cn/
    在这里插入图片描述

    2.首先介绍3.0与4.0之前的差异

    2.1.地址

    在这里插入图片描述

    2.2.添加升级如下功能

    在这里插入图片描述
    (1)3.0虽然有事务补偿机制,但4.0在此基础上不仅添加事务补偿机制的策性,还添加了管理的后台可以看到补偿的数据;同时也添加了一个回调地址,可以在补偿之前可以最先知道这次补偿的数据,也可以为我们的框架使用者提供一个决策权。

    (2)同4.0时添加的插件扩展机制,也就是说他更加开放了,他可以可以容纳更多的rpc框架,也可以更多的支持db框架,比如mongodb、redis,还有将来一些框架,如ES等等。

    3.LCN4.0原理

    3.1.架构介绍

    在这里插入图片描述
    有图可得,lcn是通过nginx作为负载均衡的转发,也就是作为Txmanager的负载均衡的一个转发服务器;然后再是我们的TxManager,也就是事务管理器,然后事务管理器依赖两个服务,一个是redis服务,一个是Eureka服务集群;Eureka集群是用于我们TxManager之间的相互服务发现。redis是用于存放我们事务组的信息以及补偿的信息。然后模块A与模块B他们都需要去配置上我们TxClient的包架构(代码的包架构);来支持我们的LCN框架,以及他们的数据库。

    3.2.核心步骤(LCN核心的三步骤)

    首先讲解下什么是事务组:事务组是指的我们在整个事务过程中把各个节点(微服务)单元的事务信息存储在一个固定单元里。但这个信息并不是代表是事务信息,而是只是作为一个模块的标示信息。

    其次介绍事务发起者与参与者
    在这里插入图片描述
    如图,在一次事务中发起的就叫做启动者或者是发起方。然后其他的微服务框架都叫做事务的参与者。

    创建事务组
    是指在事务发起方代码开始执行业务之前先调用TxManager创建事务组对象,然后拿到事务标示GroupId的过程。(这里的groupId表示的是一次事务的唯一标示,就是指我们一次事务中,会有一个groupId存在。其次这里讲述在开始执行业务之前,是因为框架是基于切面的思想,那么切面就切面到了这个方法的业务执行过程中,然后又一个around切面。再然后在开始之前,在业务没有调用业务之前会先调用TxManager去创建事务组,然后创建完事务组以后Txmanager会返回事务组信息,事务组信息中就包含GroupId这个参数,这也就是作为的创建事务组。创建完事务组之后就相当于已经产生一个事务组标示。作为一个串联过程,识别为同一次事务的一个过程)

    添加事务组
    添加事务组是指参与方在执行完业务方法以后,将该模块的事务信息添加通知给TxManager的操作。

    关闭事务组
    是指在发起方执行完业务代码以后(执行到这个地方就表明没有错误和异常,也就是执行结束了,否则并不会执行到这个地方),将发起方执行结果状态通知给TxManager的动作。当执行完关闭事务组的方法以后,TxManager将根据事务组信息来通知相应的参与模块提交或回滚事务。

    LCN正常执行序列图(来源于官方):
    在这里插入图片描述
    LCN异常执行序列图(来源于官方):
    在这里插入图片描述

    3.3.事务协调机制

    在这里插入图片描述
    如图:假设服务已经执行到关闭事务组的过程,那么接下来作为一个模块执行通知给TxManager,然后告诉他本次事务已经完成。那么如图中Txmanager下一个动作就是通过事务组的id,然后获取到本次事务组的事务信息;然后查看一下对应有那几个模块参与,然后如果是有A/B/C三个模块;那么对应的对三个模块做通知、提交、回滚。

    那么提交的时候是提交给谁呢?

    是提交给了我们的TxClient模块。然后TxCliient模块下有一个连接池,就是框架自定义的一个连接池(如图DB连接池);这个连接池其实就是在没有通知事务之前一直占有着这次事务的连接资源,就是没有释放。但是他在切面里面执行了close方法。在执行close的时候。如果需要(TxManager)分布式事务框架的连接。他被叫做“假关闭”,也就是没有关闭,只是在执行了一次关闭方法。实际的资源是没有释放的。这个资源是掌握在LCN的连接池里的。

    然后当TxManager通知提交或事务回滚的时候呢?

    TxManager会通知我们的TxClient端。然后TxClient会去执行相应的提交或回滚。提交或回滚之后再去关闭连接,然后在返回给DB连接池。这就只事务的协调机制。说白了就是代理DataSource的机制;相当于是拦截了一下连接池,控制了连接池的事务提交。

    LCN事务控制原理是由事务模块TxClient下的代理连接池与TxManager的协调配合完成的事务协调控制。

    TxClient的代理连接池实现了javax.sql.DataSource接口,并重写了close方法,事务模块在提交关闭以后TxClient连接池将执行"假关闭"操作,等待TxManager协调完成事务以后在关闭连接。

    3.4.对于代理连接池的优化

    1.自动超时机制
    任何通讯都有最大超时限制,参与模块在等待通知的状态下也有最大超时限制,当超过时间限制以后事务模块将先确认事务状态,然后再决定执行提交或者回滚操作,主要为了给最大资源占用时间加上限制。
    
    2.智能识别创建不同的连接 对于只读操作、非事务操作LCN将不开启代理功能,返回本地连接对象,对于补偿事务的启动方将开启回滚连接对象,执行完业务以后马上回滚事务。
    
    3.LCN连接重用机制 当模块在同一次事务下被重复执行时,连接资源会被重用,提高连接的使用率。
    

    4.Spring Cloud 整合LCN

    4.1.下载LCN工程;

    在LCN的github下载:https://github.com/codingapi/tx-lcn/

    4.2.配置tx-manager事务协调器

    修改其属性文件: (修改下载事务协调服务器的端口、接入的服务注册中心、使用的redis库等的集群或单点配置)

    #######################################txmanager-start#################################################
    #服务端口
    server.port=8899
    
    #tx-manager不得修改
    spring.application.name=tx-manager
    
    spring.mvc.static-path-pattern=/**
    spring.resources.static-locations=classpath:/static/
    #######################################txmanager-end#################################################
    
    
    #zookeeper地址
    #spring.cloud.zookeeper.connect-string=127.0.0.1:2181
    #spring.cloud.zookeeper.discovery.preferIpAddress = true
    
    #eureka 地址
    eureka.client.service-url.defaultZone=http://eurekaserver1:8081/eureka/,http://eurekaserver2:8082/eureka/,http://eurekaserver3:8083/eureka/
    eureka.instance.prefer-ip-address=true
    
    #######################################redis-start#################################################
    #redis 配置文件,根据情况选择集群或者单机模式
    
    ##redis 集群环境配置
    ##redis cluster
    #spring.redis.cluster.nodes=127.0.0.1:7001,127.0.0.1:7002,127.0.0.1:7003
    #spring.redis.cluster.commandTimeout=5000
    
    ##redis 单点环境配置
    #redis
    #redis主机地址
    spring.redis.host=192.168.6.211
    #redis主机端口
    spring.redis.port=6379
    #redis链接密码
    spring.redis.password=
    spring.redis.pool.maxActive=10
    spring.redis.pool.maxWait=-1
    spring.redis.pool.maxIdle=5
    spring.redis.pool.minIdle=0
    spring.redis.timeout=0
    #####################################redis-end###################################################
    
    #######################################LCN-start#################################################
    #业务模块与TxManager之间通讯的最大等待时间(单位:秒)
    #通讯时间是指:发起方与响应方之间完成一次的通讯时间。
    #该字段代表的是Tx-Client模块与TxManager模块之间的最大通讯时间,超过该时间未响应本次请求失败。
    tm.transaction.netty.delaytime = 5
    
    #业务模块与TxManager之间通讯的心跳时间(单位:秒)
    tm.transaction.netty.hearttime = 15
    
    #存储到redis下的数据最大保存时间(单位:秒)
    #该字段仅代表的事务模块数据的最大保存时间,补偿数据会永久保存。
    tm.redis.savemaxtime=30
    
    #socket server Socket对外服务端口
    #TxManager的LCN协议的端口
    tm.socket.port=9999
    
    #最大socket连接数
    #TxManager最大允许的建立连接数量
    tm.socket.maxconnection=100
    
    #事务自动补偿 (true:开启,false:关闭)
    # 说明:
    # 开启自动补偿以后,必须要配置 tm.compensate.notifyUrl 地址,仅当tm.compensate.notifyUrl 在请求补偿确认时返回success或者SUCCESS时,才会执行自动补偿,否则不会自动补偿。
    # 关闭自动补偿,当出现数据时也会 tm.compensate.notifyUrl 地址。
    # 当tm.compensate.notifyUrl 无效时,不影响TxManager运行,仅会影响自动补偿。
    tm.compensate.auto=false
    
    #事务补偿记录回调地址(rest api 地址,post json格式)
    #请求补偿是在开启自动补偿时才会请求的地址。请求分为两种:1.补偿决策,2.补偿结果通知,可通过通过action参数区分compensate为补偿请求、notify为补偿通知。
    #*注意当请求补偿决策时,需要补偿服务返回"SUCCESS"字符串以后才可以执行自动补偿。
    #请求补偿结果通知则只需要接受通知即可。
    #请求补偿的样例数据格式:
    #{"groupId":"TtQxTwJP","action":"compensate","json":"{\"address\":\"133.133.5.100:8081\",\"className\":\"com.example.demo.service.impl.DemoServiceImpl\",\"currentTime\":1511356150413,\"data\":\"C5IBLWNvbS5leGFtcGxlLmRlbW8uc2VydmljZS5pbXBsLkRlbW9TZXJ2aWNlSW1wbAwSBHNhdmUbehBqYXZhLmxhbmcuT2JqZWN0GAAQARwjeg9qYXZhLmxhbmcuQ2xhc3MYABABJCo/cHVibGljIGludCBjb20uZXhhbXBsZS5kZW1vLnNlcnZpY2UuaW1wbC5EZW1vU2VydmljZUltcGwuc2F2ZSgp\",\"groupId\":\"TtQxTwJP\",\"methodStr\":\"public int com.example.demo.service.impl.DemoServiceImpl.save()\",\"model\":\"demo1\",\"state\":0,\"time\":36,\"txGroup\":{\"groupId\":\"TtQxTwJP\",\"hasOver\":1,\"isCompensate\":0,\"list\":[{\"address\":\"133.133.5.100:8899\",\"isCompensate\":0,\"isGroup\":0,\"kid\":\"wnlEJoSl\",\"methodStr\":\"public int com.example.demo.service.impl.DemoServiceImpl.save()\",\"model\":\"demo2\",\"modelIpAddress\":\"133.133.5.100:8082\",\"channelAddress\":\"/133.133.5.100:64153\",\"notify\":1,\"uniqueKey\":\"bc13881a5d2ab2ace89ae5d34d608447\"}],\"nowTime\":0,\"startTime\":1511356150379,\"state\":1},\"uniqueKey\":\"be6eea31e382f1f0878d07cef319e4d7\"}"}
    #请求补偿的返回数据样例数据格式:
    #SUCCESS
    #请求补偿结果通知的样例数据格式:
    #{"resState":true,"groupId":"TtQxTwJP","action":"notify"}
    tm.compensate.notifyUrl=http://ip:port/path
    
    #补偿失败,再次尝试间隔(秒),最大尝试次数3次,当超过3次即为补偿失败,失败的数据依旧还会存在TxManager下。
    tm.compensate.tryTime=30
    
    #各事务模块自动补偿的时间上限(毫秒)
    #指的是模块执行自动超时的最大时间,该最大时间若过段会导致事务机制异常,该时间必须要模块之间通讯的最大超过时间。
    #例如,若模块A与模块B,请求超时的最大时间是5秒,则建议改时间至少大于5秒。
    tm.compensate.maxWaitTime=5000
    #######################################LCN-end#################################################
    
    logging.level.com.codingapi=debug
    

    4.3.启动事务协调者

    启动事务协调者,让事务协调者注入进入eureka;(注意,配置中的redis等必须正常启动)
    启动成功后,检查tx-manager协调者,见下图:
    在这里插入图片描述

    4.4 事务参与方配置

    假定:事务参与方已经是正常运行的服务提供者。样例中的数据库是mysql,连接池采用druid;

    4.4.1 pom文件引入LCN db插件和springcloud支持:
        <properties>
            <lcn.last.version>4.1.0</lcn.last.version>
        </properties>
    
    
            <!-- 引入LCN-->
            <dependency>
                <groupId>com.codingapi</groupId>
                <artifactId>transaction-springcloud</artifactId>
                <version>${lcn.last.version}</version>
                <exclusions>
                    <exclusion>
                        <groupId>org.slf4j</groupId>
                        <artifactId>*</artifactId>
                    </exclusion>
                </exclusions>
            </dependency>
            <dependency>
                <groupId>com.codingapi</groupId>
                <artifactId>tx-plugins-db</artifactId>
                <version>${lcn.last.version}</version>
                <exclusions>
                    <exclusion>
                        <groupId>org.slf4j</groupId>
                        <artifactId>*</artifactId>
                    </exclusion>
                </exclusions>
            </dependency>
    
    4.4.2 yml添加配置
    tm:
      manager:
        url: http://127.0.0.1:8899/tx/manager/
    
    4.4.3 添加TxManagerTxUrlService到spring中
    package com.mark.springcloud.service.impl;
    
    import com.codingapi.tx.config.service.TxManagerTxUrlService;
    import org.springframework.beans.factory.annotation.Value;
    import org.springframework.stereotype.Service;
    
    /**
     * 添加从注册中心获取url;注意通过注解放入容器。
     */
    @Service
    public class TxManagerTxUrlServiceImpl implements TxManagerTxUrlService{
        @Value("${tm.manager.url}")
        private String url;
        @Override
        public String getTxUrl() {
            return url;
        }
    }
    

    4.4.4 事务参与方服务:

    package com.mark.springcloud.service.impl;
    
    import java.util.List;
    
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.stereotype.Service;
    import org.springframework.transaction.annotation.Transactional;
    
    import com.codingapi.tx.annotation.ITxTransaction;
    import com.mark.springcloud.dao.DeptDao;
    import com.mark.springcloud.entities.Dept;
    import com.mark.springcloud.service.DeptService;
    /**
     * 注意需要实现 ITxTransaction;
     */
    @Service
    public class DeptServiceImpl implements DeptService, ITxTransaction {
        @Autowired
        private DeptDao dao;
    
        //注意需要开启事务
        @Override
        @Transactional
        public boolean add(Dept dept) {
            boolean rtnValue = dao.addDept(dept);
            return rtnValue;
        }
    }
    
    4.4.5 启动事务参与方

    启动spring boot应用。

    4.5 事务发起方配置

    正常情况下,一个服务一般即可能是事务的发起方也是事务的参与方。(在测试事务发起方、参与方都是同样配置。所以直接略过,只描述发起方特有代码)

    4.5.1 参照样例,实现TxManagerHttpRequestService
    package com.mark.springcloud.controller;
    
    import com.codingapi.tx.netty.service.TxManagerHttpRequestService;
    import com.lorne.core.framework.utils.http.HttpUtils;
    import org.springframework.stereotype.Service;
    
    /**
     * 常见TxManagerHttpRequestService重写get、post方法;
     */
    
    @Service
    public class TxManagerHttpRequestServiceImpl implements TxManagerHttpRequestService{
    
        @Override
        public String httpGet(String url) {
            System.out.println("httpGet-start");
            String res = HttpUtils.get(url);
            System.out.println("httpGet-end");
            return res;
        }
    
        @Override
        public String httpPost(String url, String params) {
            System.out.println("httpPost-start");
            String res = HttpUtils.post(url,params);
            System.out.println("httpPost-end");
            return res;
        }
    }
    
    4.5.2 事务发起方服务处理
    package com.mark.springcloud.controller;
    
    import java.util.List;
    
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.web.bind.annotation.PathVariable;
    import org.springframework.web.bind.annotation.RequestMapping;
    import org.springframework.web.bind.annotation.RestController;
    
    import com.codingapi.tx.annotation.TxTransaction;
    import com.mark.springcloud.entities.Dept;
    import com.mark.springcloud.service.DeptClientService;
    
    @RestController
    public class DeptController_Consumer
    {
        @Autowired
        private DeptClientService service;
        //@TxTransaction(isStart = true)注解修饰该方法为事务发起方,开启事务组。
        @TxTransaction(isStart = true)
        @RequestMapping(value = "/consumer/dept/add")
        public Object add(Dept dept)
        {
            Object rtnObj = this.service.add(dept);
            int x = (int)(Math.random()*10);
            //事务发起方随机数小于5时,抛出异常,则事务参与方事务会回滚。否则正常执行,事务参与方事务正常提交。
            if (x < 5) {
                int m = 1/0;
            }
            return rtnObj;
        }
    }
    

    4.5.3 启动事务发起方

    启动spring boot 应用。

    4.6.测试事务

    调用事务发起方服务,事务正常受事务协调者控制,当发起方和参与方都正常执行无异常时,事务正常提交,否则回滚。

    4.7.总结

    Spring Cloud 集成LCN进行分布式事务控制使用简单,整个原理也很清晰。

    展开全文
  • 基于springboot2整合LCN4.2.0 我自己改了源码 解决了springboot2.0.4与Lcn的冲突 正常运行tx-manager和各个微服务。目前官方是没有整合的,大家下载以后 直接编译打包就行。
  • lcn分布式事务搭建.rar

    2021-07-16 13:46:03
    springcloud处理分布式事务的方案(lcn),三个微服务源代码、数据库sql脚本
  • [分布式事务]LCN分布式事务.pptx
  • 提供TX-LCN的标准支持,TxManager作为分布式事务的控制放。事务发起方或者参与反都由TxClient端来控制。 (简单来说就是单独部署一套TxManager模块来实现事务管理,TxClient就是我们自己的服务系统)
  • LCN分布式事务解决方案

    千次阅读 2019-07-03 22:35:48
    一、什么是分布式事务? 二、lcn的实现思路 Lcn 的本质就是提供了一个全局的事务管理器 本地事务的提交还是回滚,由全局的事务管理器决定 2.1 本地执行的状态怎么提交给全局事务? 使用切面拦截本地事务的执行...

    一、什么是分布式事务?

    在这里插入图片描述
    在这里插入图片描述

    二、lcn的实现思路

    Lcn 的本质就是提供了一个全局的事务管理器
    本地事务的提交还是回滚,由全局的事务管理器决定
    在这里插入图片描述
    在这里插入图片描述
    2.1 本地执行的状态怎么提交给全局事务?
    使用切面拦截本地事务的执行结果,使用tcp 发送给tx-manager
    2.2 本地事务的提交或回滚怎么实现?
    等待tx-manager通知自己

    三、lcn的使用

    3.1 下载lcn-manager (全局的事务管理器)
    在这里插入图片描述
    3.2 配置lcn-manager
    配置eureka 并且配置redis
    在这里插入图片描述
    在这里插入图片描述
    Redis:
    在这里插入图片描述
    3.3 启动lcn
    在这里插入图片描述
    在这里插入图片描述
    3.4 模拟转账服务
    数据库:
    在这里插入图片描述
    在这里插入图片描述
    3.4.1 add-service
    在这里插入图片描述
    3.4.2 decr-service
    在这里插入图片描述
    3.5 2 个微服务都需要添加依赖

    <dependency>
    			<groupId>org.springframework.boot</groupId>
    			<artifactId>spring-boot-starter-actuator</artifactId>
    		</dependency>
    		<dependency>
    			<groupId>com.codingapi</groupId>
    			<artifactId>transaction-springcloud</artifactId>
    			<version>${lcn.last.version}</version>
    			<exclusions>
    				<exclusion>
    					<groupId>org.slf4j</groupId>
    					<artifactId>*</artifactId>
    				</exclusion>
    			</exclusions>
    		</dependency>
    		<dependency>
    			<groupId>com.codingapi</groupId>
    			<artifactId>tx-plugins-db</artifactId>
    			<version>${lcn.last.version}</version>
    			<exclusions>
    				<exclusion>
    					<groupId>org.slf4j</groupId>
    					<artifactId>*</artifactId>
    				</exclusion>
    			</exclusions>
    		</dependency>
    		<!-- 依据druid 来实现的拦截功能 -->
    		<dependency>
    			<groupId>com.alibaba</groupId>
    			<artifactId>druid</artifactId>
    			<version>1.0.19</version>
    		</dependency>
    

    3.6 需要自定义数据库的连接池
    在2 个微服务的启动类或配置类里面都可以添加

    @Bean
    	public DataSource dataSource() {
    		DruidDataSource dataSource = new DruidDataSource();
    		dataSource.setUrl(env.getProperty("spring.datasource.url"));
    		dataSource.setUsername(env.getProperty("spring.datasource.username"));//用户名
    		dataSource.setPassword(env.getProperty("spring.datasource.password"));//密码
    		dataSource.setInitialSize(10);
    		dataSource.setMaxActive(50);
    		dataSource.setMinIdle(0);
    		dataSource.setMaxWait(60000);
    		dataSource.setValidationQuery("SELECT 1");
    		dataSource.setTestOnBorrow(false);
    		dataSource.setTestWhileIdle(true);
    		dataSource.setPoolPreparedStatements(false);
    		return dataSource;
    	}
    

    3.7 使用
    3.7.1 事务的发起者
    转账:在这里插入图片描述
    事务的参与者
    减少钱:
    在这里插入图片描述
    加钱:
    在这里插入图片描述
    3.7.2 添加配置文件
    在这里插入图片描述
    在这里插入图片描述
    3.8 启动2 个微服务
    在这里插入图片描述
    3.9 测试转账服务
    在这里插入图片描述
    在这里插入图片描述

    展开全文
  • 分布式事务----LCNLCN原理及使用方式

    万次阅读 多人点赞 2019-05-08 11:49:33
    LCN分布式事务框架其本身并不创建事务,而是基于对本地事务的协调从而达到事务一致性的效果。 LCN5.0.2有3种模式,分别是LCN模式,TCC模式,TXC模式 LCN模式: LCN模式是通过代理Connection的方式实现对本地...
  • springboot + dubbo + LCN分布式事务 demo
  • 本文来说下tx-lcn分布式事务框架 文章目录概述 概述 tx-lcn是本地事物协调,本身并不会产生事物。
  • LCN并不生产事务LCN只是本地事务的协调工 TX-LCN定位于一款事务协调性框架,框架其本身并不操作事务,而是基于对事务的协调从而达到事务一致性的效果。
  • 基于LCN彻底解决分布式事务

    千次阅读 2020-07-09 11:03:46
    一 . 理论知识 1.数据库管理系统中事务(transaction)的四个特性:简称ACID(这种特性简称刚性事物) ...隔离性(Isolation)多个事务并发访问时,事务之间是隔离的,一个事务不应该影响其它事务运行效果。 ..
  • LCN分布式事务框架框架介绍LCN分布式事务框架其本身并不创建事务,而是基于对本地事务的协调从而达到事务一致性的效果。核心步骤创建事务组是指在事务发起方开始执行业务代码之前先调用TxManager创建事务组对象,...
  • 这期间涉及到分布式事务,当获取到 fileId 后,save 资料服务这边的数据库时,如果出现错误,则文件服务那边的记录也需要回滚。 在资料服务的 service 层上打上注解 @LcnTransaction(propagation = DTXPropagation....
  • Lcn分布式事务

    2021-05-18 20:57:34
    搭建事务协调者tx-Manager 创建tx-manager工程,并引入lcn的依赖 <dependencies> <dependency> <groupId>com.codingapi.txlcn</groupId> <artifactId>txlcn-tm</artifactId>...
  • 其实现分布式事务的原理是引入Transation Manager(简称TM),由TM来管理具体应用(TC Transaction Client)的事务确认及通知。 应用起来比较简单:1、搭建TM 2、在应用中使用@LcnTransaction 代替 @Transactional 上...
  • LCN分布式事务

    2020-05-12 11:39:03
    1.什么是分布式事务分布式事务是指事务的参与者、支持事务的服务器、资源服务器以及事务管理器分别位于不同的分布式系统的不同节点上。 例子:电商系统的订单系统和库存系统 图中包含了库存和订单两个独立的...
  • AOP实现LCN分布式事务手动回滚

    千次阅读 2018-08-07 15:22:18
    由于项目用了较为完善的异常处理机制,导致微服务在抛出异常时,立即被@ExpectionHandler捕捉掉了,造成LCN分布式事务无法捕捉到异常而无法回滚的情况。在查看LCN原理的时候,偶然发现可以获取LCN管理事务的事务组...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 2,213
精华内容 885
关键字:

lcn分布式事务是什么