MySQL-select查询为空但数据库有数据

问题复现

年后又是一波需求狂潮,在经历了上一周的痛苦上班时间之后,这周一又开始了新的需求,新的 Code 生活也伴随而来重新开始。

首先我先简略描述一下本次的需求,我这边负责的后台向服务端的接口推送一条信息,然后服务端会把接收到的信息处理后,同步推送到我们的另一个接口。
而在上一步的推送信息之后,我们这边会启动一个异步的任务会在特定的时间段内处理服务端返回的信息。
那么问题就来了,在这个异步任务中实时去查询 SQL,但是查询回来的结果是空的


问题处理步骤

  1. 开启 debug 查看 SQL 语句的执行记录,并检查参数格式是否正确。

  2. 检查 SQL 执行无误后,本地模拟线上处理流程,本地无法复现线上生产问题。

  3. 设置 SQL 禁用 MyBatis 一级缓存。同时发现该类上存在 @Transactional 注解。

    1
    useCache="false" flushCache="true"
  4. insert 部分代码与 select 部分代码拆分,不在同一个事务中提交。


总结

回顾本次的业务流程,相当于是多线程对同一个资源进行操作,而由于 MyBatis 自带的一级缓存和 SqlConnectionPool 连接池,导致异步任务的 sql 去查询时,每次都会使用同一个 connection,然后查询语句就会匹配上缓存,且因为在同一个事务中 select 语句和 insert 语句执行之间会导致事务提交存在空挡。导致在服务端推送结果之后,sql 依旧查询不到结果。


引用


个人备注

此博客内容均为作者学习所做笔记,侵删!
若转作其他用途,请注明来源!