LCN分布式事务(Java)

一、分布式事务

1.1、业务场景

在springcloud中通过feign调用的方法,不能通过@Transactional(rollbackFor = Exception.class)实现事务回滚

二、准备工作(windows环境)

2.1、windows版redis

2.2、一个搭建好的微服务项目

需要两个简单的服务能够通过feign实现互相调用,能实现数据库数据读写

三、搭建lcn分布式事务

3.1、搭建lcn服务端

3.1.1、启动类

添加注解@EnableTransactionManagerServer

3.1.2、pom

添加Lcn依赖

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

Mysql数据库驱动

        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>8.0.18</version>
        </dependency>
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>druid-spring-boot-starter</artifactId>
            <version>1.1.10</version>
        </dependency>		

3.1.3、配置文件(注册中心选的consul,配置文件配的consul相关)

server.port=9001
spring.application.name=lcn-server
spring.cloud.consul.host=localhost
spring.cloud.consul.port=8500
spring.cloud.consul.discovery.healthCheckPath=/actuator/health


spring.datasource.type=com.alibaba.druid.pool.DruidDataSource
spring.datasource.url=jdbc:mysql://127.0.0.1:3306/test?useUnicode=true&characterEncoding=utf-8&serverTimezone=UTC
spring.datasource.username=root
spring.datasource.password=admin
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
mybatis.mapper-locations=classpath*:mapping/*.xml



# 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=6000000

# 参数延迟删除时间单位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/***@**.com

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

# 开启日志,默认为false
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 的设置信息
spring.redis.host=127.0.0.1
spring.redis.port=6379
spring.redis.password=

3.1.3、搭建完成

访问lcn服务端(ip+端口),出现TxManager后台系统并能登录说明搭建成功
ps:登录密码为codingapi,可以在配置文件中修改

3.2、搭建lcn客户端

3.2.1、启动类

添加事务支持的注解
@EnableDistributedTransaction
@EnableTransactionManagement

3.2.2、pom

添加lcn依赖

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

3.2.3、配置文件

tx-lcn.client.manager-address=127.0.0.1:8070
spring.transaction.rollback-on-commit-failure=true

3.2.4、方法

需要分布式事务的方法上添加注解(主方法和feign调用的方法都加上注解)
@LcnTransaction
@Transactional

四、测试结果

4.1 说明

1、搭建好了之后有三个服务,LcnService(LCN的服务端),user1Service(lcn1号客户端),user2Service(lcn2号客户端)
2、user1Service和user2Service都有两个方法,正确添加数据的addUser()和会报错的addUserErr()
3、user2Service通过feign去调用user1Service的方法,然后再调用自身的方法
4、user2Service还有3个单独方法,testSuccess():user1Service和user2Service的正确添加方法;
test():先调用user1Service的正确方法,再调用本身的错误方法;testNormal():和test()方法一样,只是不添加分布式事务的注解
测试代码

4.2 测试结果

1、testSuccess():两个库都能正常添加数据
testSuccess()结果
2、testNormal():feign调用的添加上了,本地的没添加成功
testNormal()
3、test():feign先添加成功,由于后面出错,被回滚了
test()

user1Service输出的日志在这里插入图片描述

五、源码下载地址

https://download.csdn.net/download/qq_41833449/20326569

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值