查询接口偶发结果不同
问题现象
填写表单时发现背景上的树状菜单结构轮询数据频闪,一般情况下是完整数据,但偶尔会出现数据量缺失的情况
f12 查看请求数据 两个接口的相应数据前半部分完全一致,缺失部分尾部数据。
判断过程
断点打在mp发现mp查后的数据已经缺失,
0.开启日志查看 sql语句 “相同”(最后发现是这里的原因)
mybatis-plus:
configuration:
local-cache-scope: statement
##log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
log-impl: org.apache.ibatis.logging.slf4j.Slf4jImpl
怀疑是缓存问题
1.查看后已经默认关闭二级缓存,(实际上很多类未序列化也走不到二级缓存)
2.尝试关闭一级缓存,无效果
local-cache-scope: statement
3.开始怀疑是并发事务问题,本地没开事务
搞了个bingo2sql 看了下binlog 修改和更新的操作极少,但错误频繁,应该不是隔离级别的问题
4.头疼,应该是并发问题但是查不出来在哪。
5.最后发现原来的sql语句不同,在最后的结尾处错误数据莫名多了个limit ?
6.查了下,原来mybatis-plus(Mybatis-PageHelper)的分页插件PageHelper类使用limit ?,参数动态生成。
问题解析
PageHelper使用静态ThreadLocal,参数和线程绑定
需要保证PageHelper方法调用后要紧跟MyBatis查询方法
PageHelper方法中的finally块中会自动清楚ThreadLocal中的数据。
可能出现问题的不规范情况:
- 分页上下文未清理导致干扰数据
- 查询未执行导致上下文污染
- 数据转换后分页信息丢失