TX-LCN分布式事务日志简单分析
- 在排查前我们需要加上打印分布式事务日志配置
logging:
level:
#分布式事务日志
com.codingapi.txlcn: DEBUG
- 启动完后可以看到分布式事务启动日志
2020-04-03 15:03:29.143 DEBUG 11716 --- [ Thread-38] c.c.t.txmsg.netty.bean.SocketManager : get channel, key:/192.168.188.94:8070
2020-04-03 15:03:29.143 DEBUG 11716 --- [ Thread-38] c.c.t.txmsg.netty.bean.SocketManager : await response
2020-04-03 15:03:29.143 DEBUG 11716 --- [ntLoopGroup-2-1] c.c.t.txmsg.netty.handler.RpcCmdEncoder : send->{"key":"897af17923cd537","msg":{"action":"qtmc","state":100},"remoteKey":"/192.168.188.94:8070"}
2020-04-03 15:03:29.201 DEBUG 11716 --- [ntLoopGroup-2-1] c.c.t.txmsg.netty.handler.RpcCmdDecoder : cmd->{"key":"897af17923cd537","msg":{"action":"qtmc","data":["192.168.188.94:8070"],"state":200},"remoteKey":"/10.188.1.53:64265"}
2020-04-03 15:03:29.202 DEBUG 11716 --- [ntLoopGroup-2-1] c.c.t.txmsg.netty.handler.RpcCmdDecoder : got response message[Netty Handler]
2020-04-03 15:03:29.203 DEBUG 11716 --- [ Thread-38] c.c.txlcn.txmsg.netty.bean.NettyRpcCmd : got response. 897af17923cd537
2020-04-03 15:03:29.203 DEBUG 11716 --- [ Thread-38] c.c.t.txmsg.netty.bean.SocketManager : response is: MessageDto(action=qtmc, groupId=null, data=[192.168.188.94:8070], state=200)
2020-04-03 15:03:29.203 DEBUG 11716 --- [ Thread-38] c.c.t.txmsg.netty.impl.NettyRpcClient : cmd request used time: 60 ms
2020-04-03 15:03:29.203 DEBUG 11716 --- [ Thread-38] c.c.txlcn.tc.txmsg.LoopMessenger : request action: qtmc. TM[/192.168.188.94:8070]
2020-04-03 15:03:29.203 DEBUG 11716 --- [ Thread-38] com.codingapi.txlcn.tc.txmsg.TMSearcher : wait connect size is 0
当我们对进行操作产生分布式事务并回滚时可以在日志中看到
事务发起方
@LcnTransaction
@Transactional(rollbackFor = Exception.class)
@Override
public boolean userDeleteRole(UserVo userVo) {
LogSystem logSystem = new LogSystem();
logSystem.setIp("测试");
logSystem.setUserName("测试");
logSystem.setUserId("测试");
// 远程调用
userLogApi.addSystemLog(logSystem);
// 模拟异常
int i=1/0;
return true;
}
事务日志
若在方法中发生异常可以看到分布式日志有个rollback transaction异常回滚信息若没有该信息则表示没有加入异常回滚信息到分布式事务组则会导致本地事务回滚成功远程事务回滚失败
被调用方
@Override
@LcnTransaction
@Transactional(rollbackFor = Exception.class)
public void save(LogSystem logSystem) {
logSystemMapper.insert(logSystem);
System.out.println(logSystem.getId());
}
事务日志
若正常情况下事务调用若调用方有回滚信息加入到事务组中被调用方会去消费该回滚信息回滚本地事务
而在我们使用全局事务配置时会导致本地发生异常后导致回滚成功但不会加入回滚信息到事务组导致远程服务事务不回滚