LCN解决分布式事务

1. LCN背景

LCN框架在2017年6月份发布第一个版本,从开始的1.0,已经发展到了5.0版本。

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

5.0以后由于框架兼容了LCN、TCC、TXC三种事务模式,为了避免区分LCN模式,特此将LCN分布式事务改名为TX-LCN分布式事务框架。

2. LCN定位

TX-LCN定位于一款事务协调性框架,框架其本身并不操作事务,而是基于对事务的协调从而达到事务一致性的效果。

3. 原理

协调者(TM)和客户端(TC)通过netty保持长链接状态;

调用方进入接口业务之前,会通过AOP技术进到@LcnTransaction注解中去,此时LCN协调者那边生成注册一个全局的事务组Id(groupId);

当调用方通过rpc调用服务提供方的时候,lcn重写了Feign客户端,会从ThreadLocal中拿到该事务组Id(groupId),并将该事务组Id设置到请求头中;

服务提供方在请求头中获取到了这个groupId的时候,lcn会标识该服务为参与方并加入到该事务组,并会被lcn代理数据源,当该服务业务逻辑执行完成后,进行数据源的假关闭,并不会真正的提交或回滚当前服务的事务;

当调用者执行完全部业务逻辑的时候,如果无异常会告知lcn协调者,lcn协调者再分别告诉该请求链上的所有参与方可以提交了,再进行真正的提交。若发起方调用完参与方后报错了,也会告知lcn协调者,lcn协调者再告知所有的参与方进行真正的回滚操作,这样就解决了分布式事务的问题。

4. 代码实现

(1)注册中心:这里选nacos
(2)部署协调者

在部署TX-LCN中有遇到问题或想查看部署详细的操作可以访问如下地址:http://www.txlcn.org/zh-cn/docs/start.html ;
github下载源码地址:https://github.com/codingapi/tx-lcn/releases。

①创建数据库表
创建相应的数据库表,先创建MySQL数据库, 名称为: tx-manager,再创建数据库表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(0) NULL DEFAULT NULL,PRIMARY KEY (`id`) USING BTREE
) ENGINE = InnoDB AUTO_INCREMENT = 1 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci ROW_FORMAT = Dynamic;

②修改配置文件
打开我们下好的源码,找到txlcn-tm模块,修改其配置文件application.properties,具体修改的内容根据自己业务而定,官方也有相应配置内容,但需要注意首次运行要将配置文件的这段设置为create:spring.jpa.hibernate.ddl-auto=create。
最后打包并运行,访问控制台的端口为7919,默认密码codingapi。

(3)配置客户端TC环境
TC就是客户端,也就是微服务,配置相对简单如下:

①引入相关依赖
其中一个是lcn核心包,一个是建立长连接的netty包;

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

②配置yml文件
设置服务连接到lcn服务。(注意下lcn控制台是7970,这个8070是lcn通讯端口号)

tx-lcn:client:manager-address: 127.0.0.1:8070logger:enabled: true

③添加注解
引入依赖并配置好yml文件后,在服务的启动类上添加@EnableDistributedTransaction注解,开启分布式事务。

(4)
做好这些配置后,开始启动项目,启动成功项目后可以在lcn控制台看到相应的服务列表,能够看到则说明服务已经实现了对lcn事务协调者管理器的注册。

看到服务都能够成功注册进TM后,便全部完成TX-LCN本地环境的搭建,后续可以开始测试自己的业务代码是否解决了分布式事务的问题。

分布式事务-LCN解决分布式事务相关推荐

  1. 搞懂分布式技术19:使用RocketMQ事务消息解决分布式事务

    搞懂分布式技术19:使用RocketMQ事务消息解决分布式事务 初步认识RocketMQ的核心模块 rocketmq模块 rocketmq-broker:接受生产者发来的消息并存储(通过调用rocke ...

  2. 分布式事务 - 如何解决分布式事务问题?

    分布式事物 - 如何解决分布式事务问题? 面试题 分布式事务了解吗?你们是如何解决分布式事务问题的? 面试官心理分析 只要聊到你做了分布式系统,必问分布式事务,你对分布式事务一无所知的话,确实会很坑, ...

  3. LCN分布式事务框架解决分布式事务一致性问题

    LCN分布式事务框架 框架介绍 LCN分布式事务框架其本身并不创建事务,而是基于对本地事务的协调从而达到事务一致性的效果. 核心步骤 创建事务组 是指在事务发起方开始执行业务代码之前先调用TxMana ...

  4. 基于数据库的事务消息解决分布式事务方案

    转载请注明出处:http://www.cnblogs.com/lizo/p/8516502.html 概述 当单库已不能支撑当前业务的时候,我们往往都考虑进行分库(横向拆分或者纵向拆分).但分库有个无 ...

  5. Java中的事务——全局事务与本地事务

    转载自   Java中的事务--全局事务与本地事务 在上一篇文章中说到过,Java事务的类型有三种:JDBC事务.JTA(Java Transaction API)事务.容器事务. 这是从事务的实现角 ...

  6. rabbitmq 查询版本_基于rabbitmq解决分布式事务

    分布式事务要解决的问题是保证二个数据库数据的一致性,本地事务ACID属于刚性事务,基于CAP理论,分布式事务的核心要点柔性事务,最终一致性. 基于rabbitmq解决分布式事务要点如下 生产者采用发送 ...

  7. RocketMQ如何解决分布式事务

    本文来说下RocketMQ如何解决分布式事务 文章目录 基本实现思路 RocketMQ的事务消息状态 代码实例 maven导入 yaml文件配置 核心代码 本文小结 基本实现思路 核心思想:事务消息总 ...

  8. 少年,你知道怎么用一行代码解决分布式事务问题吗?

    一.前言 分布式事务想必大家都比较熟悉了,也知道分布式事务的一些解决方案,什么两阶段,三阶段,基于消息的最终一致性等方法,相信大家都是耳熟能详了.这个问题也是面试中被问的最多的.略作准备的话,基本是难 ...

  9. spring cloud: TX-LCN解决分布式事务

    分布式事务预备知识 1.本地事务的ACID A:原子性(Atomicity) 一个事务(transaction)中的所有操作,要么全部完成,要么全部不完成,不会结束在中间某个环节. 事务在执行过程中发 ...

  10. 基于消息中间件解决分布式事务的开源框架Myth

    基于消息中间件的解决分布式事务框架:https://github.com/yu199195/myth 1.rpc框架支持 : dubbo,motan,springcloud. 2.消息中间件支持 : ...

最新文章

  1. Delphi中预想不到的代码楼主zswang(伴水清清)(专家门诊清洁工)2002-05-16 14:20:38 在 Delphi / VCL组件开发及应用 提问
  2. MySQL Workbench的使用教程 (初级入门版)
  3. 如何在 C# 中使用 FTP 上传文件
  4. python取的键不存在_Python3基础 dict get 在查询不存在的键时,返回指定的内容
  5. Linux查看内存占用--free
  6. Illustrator中文版教程,如何在 Illustrator 中添加文字?
  7. Linux 之CentOS7使用firewalld打开关闭防火墙与端口
  8. 业务层——跨越边界传输数据
  9. 三大运营商布局金融的套路不同,还能否搭上移动支付的快车?
  10. java计算机毕业设计医院各科室财务管理2021源码+系统+mysql数据库+lw文档
  11. 抖音视频如何去除水印
  12. 消灭害虫V1.0 | EliminatePests V1.0
  13. 【Vue报错】This is probably not a problem with npm. There is likely additional logging output above
  14. jcad计算机辅助设计论文,2017 China CADCG
  15. Fluent Ribbon界面布局
  16. 利用python爬取网页图片
  17. Android Bluetooth OPP的理解与使用之八
  18. 爬虫进行isca-speech分会场的pdf批量下载部分问题解决
  19. TDSQL学习(TDSQL MySQL版)
  20. 计算机管理培训考试试题,计算机技能培训试题一

热门文章

  1. 透气清爽的高回弹跑鞋,跑步轻松畅快,咕咚逐日21K体验
  2. 文件夹删除不掉-需要管理员权限删除
  3. html页面线条走动特效,html5 canvas绘制随机游动线条动画特效
  4. photoshop安装教程
  5. STM32--DSP库使用(1)
  6. java读取目录下所有txt_java读取同目录下的txt文件
  7. 仅仅CSS就实现了轮播图----利用关键帧动画实现轮播图效果
  8. Kubernetes快速部署
  9. 4、HFSS的边界条件
  10. Scrum板与Kanban如何抉择?敏捷工具:SHSYdsjgyadtgad