前提

本文不介绍LCN理论知识,如不清楚,建议先通过文章进行了解,8种常用的分布式事务解决方案详细分析,该文章中有关于LCN模式的简要说明。

快速开始

1、环境准备

环境依赖:

JDK1.8+、Mysql5.6+、Redis3.2+

数据库初始化脚本:

创建数据库名称为:tx-manager,并在此数据库下新建t_tx_exception表。

DROP TABLE IF EXISTS `t_tx_exception`;
CREATE TABLE `t_tx_exception`  (`id` bigint(20) NOT NULL AUTO_INCREMENT,`group_id` varchar(32) 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(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL,`transaction_state` tinyint(4) NULL DEFAULT NULL,`registrar` tinyint(4) NULL DEFAULT NULL COMMENT '-1 未知 0 Manager 通知事务失败, 1 client询问事务状态失败2 事务发起方关闭事务组失败',`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 = 967 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci ROW_FORMAT = Dynamic;SET FOREIGN_KEY_CHECKS = 1;

2、TM角色服务准备

新建一个最基础的SpringBoot工程

添加配置文件

#服务名
spring.application.name=tx-manager
#端口
server.port=7970#数据库配置
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
spring.datasource.url=jdbc:mysql://10.0.0.50:3306/tx-manager?characterEncoding=UTF-8&serverTimezone=Asia/Shanghai
spring.datasource.username=root
spring.datasource.password=123456#mybatis配置
mybatis.configuration.map-underscore-to-camel-case=true
mybatis.configuration.use-generated-keys=true#redis配置
spring.redis.host=10.0.0.150
spring.redis.port=6379#开启日志
tx-lcn.logger.enabled=true#TxManager Host IP
tx-lcn.manager.host=127.0.0.1
#TxClient 连接请求端口
tx-lcn.manager.port=8070

pom依赖

<dependency><groupId>com.codingapi.txlcn</groupId><artifactId>txlcn-tm</artifactId><version>5.0.2.RELEASE</version>
</dependency><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>

添加注解

SpringApplication,只需要添加一个@EnableTransactionManagerServer即可

import com.codingapi.txlcn.tm.config.EnableTransactionManagerServer;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;@SpringBootApplication
@EnableTransactionManagerServer
public class LcnTmApplication {public static void main(String[] args) {SpringApplication.run(LcnTmApplication.class, args);}}

验证

TM最基础的准备就已经完成了,启动服务,访问7970端口,登录TM提供的后台管理,密码默认codingapi。

3、TC模块准备

由于最终需要演示分布式事务,需要TC准备两台SpringCloud服务,服务之间通过Feign进行远程调用。

配置文件

TC端的配置文件修改很简单,只需要额外添加一个配置项即可

#之间在TM服务里配置的IP、TxClient连接请求端口
tx-lcn.client.manager-address=127.0.0.1:8070

pom依赖

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

添加启动注解

SpringApplication,也只需要添加一个@EnableDistributedTransaction即可

import com.codingapi.txlcn.tc.config.EnableDistributedTransaction;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.circuitbreaker.EnableCircuitBreaker;
import org.springframework.cloud.client.loadbalancer.LoadBalanced;
import org.springframework.cloud.netflix.eureka.EnableEurekaClient;
import org.springframework.cloud.openfeign.EnableFeignClients;
import org.springframework.context.annotation.Bean;
import org.springframework.web.client.RestTemplate;@EnableEurekaClient
@SpringBootApplication
@EnableFeignClients
@EnableCircuitBreaker
@EnableDistributedTransaction
@MapperScan("com.wyl.springcloud.mapper")
public class MembershipApplication {public static void main(String[] args) {SpringApplication.run(MembershipApplication.class, args);}@Bean@LoadBalancedpublic RestTemplate restTemplate() {return new RestTemplate();}
}

再搭一个配置一样的服务,最终准备好两台服务,一台order服务,一台member服务。

TC端事务方法添加注解

order服务

    /*** 通过添加@LcnTransaction注解,控制分布式事务*/@LcnTransactionpublic void update() {///本地事务userMapper.update();}

member服务

    /*** 通过添加@LcnTransaction注解,控制分布式事务*/@LcnTransactionpublic void update() {//通过feign远程调用order服务orderFeign.update();//本地事务userMapper.update();//模拟远程调用后,本地执行异常int i = 1/0;}

验证

启动两台服务后,再看TM系统观后,服务已在线。

4、调用流程说明

演示两台服务之间的调用流程

演示业务表

当前tran_test表数据。

异常、回滚

调用服务,异常


两条数据都未被修改,达到分布式事务效果。

正常完成请求调用

把member服务的本地异常去掉,再次尝试。

    /*** 通过添加@LcnTransaction注解,控制分布式事务*/@LcnTransactionpublic void update() {//通过feign远程调用order服务orderFeign.update();//本地事务userMapper.update();//模拟远程调用后,本地执行异常//int i = 1/0;}

调用成功

数据修改成功

SpringCloud整合LCN分布式事务模式相关推荐

  1. SpringCloud(7) LCN分布式事务框架入门

    官网:http://www.txlcn.org/ LCN原理:https://github.com/codingapi/tx-lcn/wiki/LCN%E5%8E%9F%E7%90%86 入门测试: ...

  2. SpringCloud 整合 TX-LCN分布式事务框架

    微服务兴起,分布式事务也成为亟需解决的难题,业界解决方案很多,今天介绍一个我目前觉得最好用的TX-LCN. 官网地址:http://www.txlcn.org/zh-cn/ 一.TX-LCN介绍 TX ...

  3. SpringCloud分布式事务解决方案 整合 TX-LCN分布式事务框架

    第一章 分布式事务介绍 一.什么是分布式事务 分布式事务是指事务的参与者.支持事务的服务器.资源服务器以及事务管理器分别位于不同的分布式系统的不同节点之上. 举个栗子: 电商系统中的订单系统与库存系统 ...

  4. SpringCloud - LCN分布式事务框架

    官网:http://www.txlcn.org/ LCN原理:https://github.com/codingapi/tx-lcn/wiki/LCN%E5%8E%9F%E7%90%86 入门测试: ...

  5. 蚂蚁金服大规模分布式事务实践及四种分布式事务模式

    蚂蚁金服大规模分布式事务实践及四种分布式事务模式 作者: 绍辉 | 2019-07-30 13:55   收藏: 1 本文整理自蚂蚁金服技术专家.分布式事务 Seata 发起者之一张森(花名:绍辉)在 ...

  6. LCN分布式事务框架实战

    本文来写个LCN分布式事务框架实战例子 文章目录 概述 概述 lcn分布式事务教程https://www.codingapi.com/docs/txlcn-preface/

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

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

  8. Springcloud+Seata+nacos 分布式事务项目搭建 AT模式

    前言 本文要求对Springcloud有一定了解,对分布式事务本身有一定认知,如果不了解微服务,建议先看看Spring Cloud的基本认识和使用Spring Cloud的基本教程,再回头学习本文 为 ...

  9. LCN分布式事务框架

    1.LCN是什么 LCN是国产开源的分布式事务处理框架.LCN即:lock(锁定事务单元).confirm(确认事务模块状态).notify(通知事务). 官网:http://www.txlcn.or ...

  10. 8.Spring Cloud Alibaba教程:整合Seata分布式事务

    概述 Seata 是一款开源的分布式事务解决方案,致力于提供高性能和简单易用的分布式事务服务. 更多的介绍可以参考官方文档:Seata快速入门 本篇主要是介绍Spring Cloud Alibaba ...

最新文章

  1. mvc 职能划分_【转】MVC中的操作如何分类(MVC层次的划分)
  2. angularjs结合d3js实现资源展示
  3. linux重启终端后go命令,Linux基础命令之关机,重启,注销-Go语言中文社区
  4. Java多线程知识小抄集(三)
  5. mysql8碰到 ERROR 1064 (42000)
  6. Android之在window下面开发常用的adb命令(不断更新)
  7. 知乎高赞:看懂这个颠覆世界观的认知,远比做1000道题更有用!
  8. 【牛客 - 318M】被打脸的潇洒哥(几何问题,水题,结论,知识点)
  9. 2021抖音汽车生态报告
  10. 【IDEA】Warning:scala: skipping Scala files without a Scala SDK in module(s) systemimport
  11. python gRPC
  12. 审查元素找不到创建的元素_面试被问:Selenium元素定位不到问题,如何回答?...
  13. 模型压缩_模型压缩:
  14. GPS坐标与UTM坐标的转换
  15. fft算法matlab程序,FFT算法(用matlab实现).doc
  16. 网站外链如何才能被搜索引擎快速收录呢?
  17. 酒店标识的要求不同其设计也不同
  18. mysql数据中包含不间断空格(ascii值为194和160)解决办法
  19. windows如何查看电脑开关机记录
  20. 在Linux中各类重要文件被丢失的解决方式

热门文章

  1. 微信小程序模板消息接口下线了,不用慌,调用统一服务消息接口来实现相同功能
  2. 马云的教、马云的会、马云的墓
  3. 实时数据采集架构原理(蜂巢)
  4. K线形态分析交易系统
  5. 第三阶段应用层——1.9 数码相册—在LCD上显示BMP图片
  6. •检查你的代理设置127.0.0.1:2****。 转到“工具”“Internet 选项”“连接”。如果你在 LAN 中,请单击“局域网设置”。
  7. [No000030]程序员节发点别的:中国教育整个把人脑子搞坏了-易中天
  8. 计算机用什么配置好电脑,买电脑主要看哪些配置 决定电脑好坏的关键
  9. 2020年3月—— ES6
  10. 音量公式_家庭影院功放功率与音量之间的秘密