本文主要是介绍Mybatis同一个事务中查询相同的SQL导致后者数据有问题,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
Mybatis同一个事务中查询相同的SQL导致后者数据有问题
问题描述
- 在开发时,因为有较长的代码用到了事务,在将近事务结束时查询到的数据是跟数据库不一样的
问题排查
- 排查发现出问题的数据是没有SQL打印的,根据日志排查,发现是在前面的代码已经执行过相同的SQL了。在事务中,同一句SQL第二次是不会再查询数据库的
获取数据
- 在事务中首先会根据当前的SQL尝试从缓存中获取,要执行的查询SQL是key,如果拿到就返回,拿不到就需要从数据库中获取,核心类是org.apache.ibatis.executor.BaseExecutor,如下图所示:
放入本地缓存
- 查询数据库后,将结果放入到本地缓存中
问题发现
- 在第一次查询数据库时,将查询到的数据做了处理,这个数据是在内存中的,当第二次查询时,拿到了内存中改过的数据,这样就会看起来和数据库的不一致!!!
这篇关于Mybatis同一个事务中查询相同的SQL导致后者数据有问题的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!