github 地址:https://github.com/codingapi/tx-lcn/releases
TM部署
1、源码部署
下载源码::https://github.com/codingapi/tx-lcn/releases
或者到阿里云盘中下载

修改数据库、redis配置:如上图
注意:
server.port=7970 # tm管理端端口
tx-lcn.manager.host=127.0.0.1 # tm 客户端tc连接IP
tx-lcn.manager.port=8070 # tm 客户端tc连接端口
tx-lcn.manager.adminKey=jm123456. # tm管理端密码
直接运行main启动即可

注意,在数据库中,需要创建默认表
-- auto-generated definition
create table t_tx_exception
(
id bigint auto_increment
primary key,
group_id varchar(64) null,
unit_id varchar(32) null,
mod_id varchar(128) null,
transaction_state tinyint null,
registrar tinyint null,
remark varchar(4096) null,
ex_state tinyint null comment '0 未解决 1已解决',
create_time datetime null
)
row_format = DYNAMIC;
2、自己搭建springboot 启动
1、创建一个空的springboot项目

2、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>
3、修改配置文件
#服务名
spring.application.name=tx-manager
#端口
server.port=7970
#数据库配置
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
spring.datasource.url=jdbc:mysql://192.168.1.40: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=192.168.1.111
spring.redis.port=6379
spring.redis.password=123456
spring.redis.database=2
#开启日志
tx-lcn.logger.enabled=true
#TxManager Host IP
tx-lcn.manager.host=127.0.0.1
#TxClient 连接请求端口
tx-lcn.manager.port=8070
tx-lcn.manager.adminKey=jm123456.
4、启动项目即可

注意,在数据库中,需要创建默认表
-- auto-generated definition
create table t_tx_exception
(
id bigint auto_increment
primary key,
group_id varchar(64) null,
unit_id varchar(32) null,
mod_id varchar(128) null,
transaction_state tinyint null,
registrar tinyint null,
remark varchar(4096) null,
ex_state tinyint null comment '0 未解决 1已解决',
create_time datetime null
)
row_format = DYNAMIC;
3、访问TM后台

TC集成,连接TM
1、引入依赖
在自己的项目中引入TC依赖
jsqlparser 和mybatis的分页插件有冲突,需要排除
slf4j 需要排除,与自带的logback冲突
<!-- tx-lcn -->
<dependency>
<groupId>com.codingapi.txlcn</groupId>
<artifactId>txlcn-tc</artifactId>
<version>5.0.2.RELEASE</version>
<exclusions>
<exclusion>
<groupId>com.github.jsqlparser</groupId>
<artifactId>jsqlparser</artifactId>
</exclusion>
<exclusion>
<groupId>org.slf4j</groupId>
<artifactId>*</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>com.codingapi.txlcn</groupId>
<artifactId>txlcn-txmsg-netty</artifactId>
<version>5.0.2.RELEASE</version>
<exclusions>
<exclusion>
<groupId>org.slf4j</groupId>
<artifactId>*</artifactId>
</exclusion>
</exclusions>
</dependency>
2、修改配置
tx-lcn:
client:
manager-address: 127.0.0.1:8070 # TM的IP:TM客户端连接端口
logger:
enabled: false # 关闭日志
3、编写测试业务接口
package com.xxxxx.iotd.controller;
import com.alibaba.fastjson.JSONObject;
import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
import com.codingapi.txlcn.tc.annotation.LcnTransaction;
import com.xxxxx.common.core.constant.SecurityConstants;
import com.xxxxx.common.core.exception.BusinessException;
import com.xxxxx.common.core.util.R;
import com.xxxxx.common.security.annotation.Inner;
import com.xxxxx.iotd.api.feign.RemoteIotdService;
import com.xxxxx.iotd.finance.entity.IotdOrderEntity;
import com.xxxxx.iotd.finance.mapper.IotdOrderMapper;
import io.swagger.v3.oas.annotations.security.SecurityRequirement;
import io.swagger.v3.oas.annotations.tags.Tag;
import lombok.RequiredArgsConstructor;
import org.springframework.http.HttpHeaders;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
@RestController
@RequiredArgsConstructor
@RequestMapping("/test")
@Tag(description = "test" , name = "短信相关" )
@SecurityRequirement(name = HttpHeaders.AUTHORIZATION)
public class TestController {
private final IotdOrderMapper iotdOrderMapper;
//Feign接口
private final RemoteIotdService remoteIotdService;
@LcnTransaction
@Inner
@GetMapping(value = "/test1")
public R<String> test1(@RequestParam(value = "p1")String p1,@RequestParam(value = "p2")String p2){
iotdOrderMapper.update(new IotdOrderEntity(), new LambdaUpdateWrapper<IotdOrderEntity>()
.eq(IotdOrderEntity::getOrderCode,"D1914190876176928768R1")
.set(IotdOrderEntity::getOrderRemarks,p2)
);
return R.ok();
}
@LcnTransaction
@Inner(value = false)
@GetMapping(value = "/test2")
public R<String> test2(@RequestParam(value = "p1")String p1,@RequestParam(value = "p2")String p2){
iotdOrderMapper.update(new IotdOrderEntity(), new LambdaUpdateWrapper<IotdOrderEntity>()
.eq(IotdOrderEntity::getOrderCode,p1)
.set(IotdOrderEntity::getOrderRemarks,p2)
);
R<String> stringR = remoteIotdService.test1(p1, p2 + "_test2"
, SecurityConstants.FROM_IN);
System.out.println(JSONObject.toJSONString(stringR));
if(!stringR.isSuccess()){
throw new BusinessException(stringR.getMsg());
}
//模拟异常
if(p2.equals("22222")){
throw new BusinessException("业务自定义异常");
}
return R.ok();
}
}
Feign远程接口
package com.xxxxx.iotd.api.feign;
import com.xxxxx.common.core.constant.SecurityConstants;
import com.xxxxx.common.core.util.R;
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestHeader;
import org.springframework.web.bind.annotation.RequestParam;
@FeignClient(contextId = "remoteIotdService", value = "jm-cloud-iotd-biz")
public interface RemoteIotdService {
@GetMapping(value = "/test/test1")
R<String> test1(@RequestParam(value = "p1")String p1, @RequestParam(value = "p2")String p2,
@RequestHeader(SecurityConstants.FROM) String from);
}
4、启动项目 项目整体



5、测试
1、正常测试


2、异常测试,数据回滚:p1=22222 就会触发模拟异常


数据库数据也没有更新
