tidb有数据丢失情况

【概述】 偶尔有日志记录插入成功,但是表里对应数据确查不到的

【应用框架及开发适配业务逻辑】
springboot2.6,mybatis-plus3.5.1 ,dynamic-datasource-spring-boot-starter3.5.1
按多数据源分库
【背景】
简单的save方法
@DSTransactional
public boolean save(Clean entity) {
return super.save(entity);
}
调用方法调用前会打印出参数, 调用后如果返回ok,会打印成功日志.
【问题】
业务查询某条数据时,发现数据不存在,查看日志发现调用前参数和调用后都输出成功的,且没有异常产生, 类似情况其他表也偶有发生.

2 个赞

是不是Java 开源框架 @DSTransactional 这个有问题

1 个赞

快速排查步骤

  1. 核对插入前后当前生效数据源,确认库表无误
  2. 关闭业务缓存,直接 TiDB 客户端原表 SQL 查询校验
  3. 查看 TiDB 事务日志、binlog,核实语句是否真正提交
  4. 检查主键、唯一索引,排查重复写入覆盖问题
  5. 简化事务逻辑,去掉嵌套事务测试单条插入
2 个赞

Tidb不可能丢数据,问题大概率出在开源框架

2 个赞

到tidb节点服务器上的日志目录,找到该时间段内的日志信息,看看有没有save方法对应的insert语法

2 个赞

如果库整体负载不高,可以考虑开一会generallog看看。

1 个赞

数据量不大可以抓包看看

开 general 日志看吧,或者把慢查询阈值调整为 0

1 个赞

估计是没执行

感谢老师分享

gc时间改大点,看看历史数据是不是真的存在

遇到bug了吗

应该是框架问题,tidb不是丢失数据的

save 方法所在的类内部有 try-catch 块,并且捕获了异常但没有抛出,MyBatis-Plus 的 super.save(entity) 可能会因为底层的 SQL 异常(如主键冲突、字段超长等)而返回 false ,或者异常被吃掉后外层逻辑依然打印了“成功日志”。

找到问题原因了吗

开debug看日志

大概率是多数据源事务注解、框架异常捕获逻辑导致。
核对数据源、关闭业务缓存直连数据库查询;
开启 TiDB 通用日志 / 抓包验证 SQL 是否真实执行;
排查主键冲突、字段超长等隐性报错,检查代码是否吞掉异常、误判执行结果。

学习了,感谢大佬们

思路清晰,一看就懂了,感谢大佬分享

哦原来如此