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导致后者数据有问题