Mybatis同一个事务中查询相同的SQL导致后者数据有问题

Posted starjuly

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Mybatis同一个事务中查询相同的SQL导致后者数据有问题相关的知识,希望对你有一定的参考价值。

Mybatis同一个事务中查询相同的SQL导致后者数据有问题

问题描述

  • 在开发时,因为有较长的代码用到了事务,在将近事务结束时查询到的数据是跟数据库不一样的

问题排查

  • 排查发现出问题的数据是没有SQL打印的,根据日志排查,发现是在前面的代码已经执行过相同的SQL了。在事务中,同一句SQL第二次是不会再查询数据库的

获取数据

  • 在事务中首先会根据当前的SQL尝试从缓存中获取,要执行的查询SQL是key,如果拿到就返回,拿不到就需要从数据库中获取,核心类是org.apache.ibatis.executor.BaseExecutor,如下图所示:

放入本地缓存

  • 查询数据库后,将结果放入到本地缓存中

问题发现

  • 在第一次查询数据库时,将查询到的数据做了处理,这个数据是在内存中的,当第二次查询时,拿到了内存中改过的数据,这样就会看起来和数据库的不一致!!!

以上是关于Mybatis同一个事务中查询相同的SQL导致后者数据有问题的主要内容,如果未能解决你的问题,请参考以下文章

Mybatis同一个事务中查询相同的SQL导致后者数据有问题

Java--Mybatis关联查询,多表同名字段导致SQL报错

mybatis的sql语句导致索引失效,使得查询超时

Mybatis中添加查询修改删除

Mybatis的二级缓存

Mybatis的二级缓存