• gts分布式事务框架踩坑记录


    分布式项目,一部分实例使用gts管理事务,一部分实例没有事务管理。

    导致的问题是被管理的事务发生了回滚,没有被事务管理的数据入库了!!!

    这么严重的问题!最终叫我去改,我很有情绪啊。早干嘛去了,这个问题早就被我们这些底层码农提出来了,技术老大就是不理会。非得除了问题,才去修改。

    正文:

    场景:服务A 调用 服务B,服务B 调用 服务C。

    A 和 B 同属一个nacos集群中,使用了git事务管理,可以正常提交事务和回滚事务。C 是一个单独的应用,没有被gts管理。

    C加了gts的配置,为什么没有xid

    TxcContext.getCurrentXid(),查看xid,发现C的上下文中没有xid,但是B服务中有xid。

    因为B调用C是用http调用的。

    于是在把B中的xid放入http的请求头中一起请求。

    C有xid,为什么数据不会滚?

    检查数据库,发现txc_undo_log中也没有数据。检查项目,发现是DataSource的问题,gts需要使用它自己的代理数据源。

    配置好代理数据源,报错 getTableMeta failed?

    gts获取表信息失败,追踪源码发现gts解析sql语句时,把表名全部转为大写了。不明白为什么。

    解决方法是改造获取表名的源码。利用Java加载类的机制,优先加载classes目录下的类,再去加载lib下的类。把源码的类copy一份在自己的工程代码中,注意类路径要和源码保持一致。然后修改获取表名的方法,去除转大写的操作。这个类是 com.taobao.txc.parser.visitor.cobar.TxcAstNode

    插入数据报错Java类型和JDBC的类型不一致?

    gts的数据源使用的是java.sql.Date,为工程中使用的java.unit.Date。修改工程代码中设置时间使用java.sql.Date。不报错了,但是日期入库后没有时分秒!!!这可不行。

    再次审查代码,发现是mysql的驱动包的问题,数据库用的是mysql8,工程中的驱动包是mysql5,两个版本不一致。

    更改工程中mysql的版本,java.util.Date可以正常入库,问题解决。

    部分数据可以回滚,部分数据无法回滚?

    查看gts日志,发现日志在报错时间格式转换错误,txc_undo_log中时间的快照记录是”2022-08-18T00:00:00“,gts无法转换是时间存储到数据库,于是数据一直无法回滚。

    继续修改源码,把转换时间的方式修改一下即可

  • 相关阅读:
    GitHub标星90K,这份持续霸榜的Leetcode刷题手册到底有多强?
    【云原生】k8s 部署redis集群
    矩阵消元-MIT
    前端取图片相同颜色作为遮罩或者背景
    万能的JSON解析方法,获取指定字段值
    [附源码]java毕业设计毕业设计管理系统
    随时随地查看远程试验数据与记录——IPEhub2与IPEmotion APP
    基本if选择结构以及random
    如何查看自己的GPU型号以及配置信息
    计算机网络基础 ---- NAT----网络地址转换----详解
  • 原文地址:https://blog.csdn.net/Yuwen_forJava/article/details/126411802