问题复现
年后又是一波需求狂潮,在经历了上一周的痛苦上班时间之后,这周一又开始了新的需求,新的 Code 生活也伴随而来重新开始。
首先我先简略描述一下本次的需求,我这边负责的后台向服务端的接口推送一条信息,然后服务端会把接收到的信息处理后,同步推送到我们的另一个接口。
而在上一步的推送信息之后,我们这边会启动一个异步的任务会在特定的时间段内处理服务端返回的信息。
那么问题就来了,在这个异步任务中实时去查询 SQL
,但是查询回来的结果是空的。
问题处理步骤
开启
debug
查看SQL
语句的执行记录,并检查参数格式是否正确。检查
SQL
执行无误后,本地模拟线上处理流程,本地无法复现线上生产问题。设置
SQL
禁用MyBatis
一级缓存。同时发现该类上存在@Transactional
注解。1
useCache="false" flushCache="true"
将
insert
部分代码与select
部分代码拆分,不在同一个事务中提交。
总结
回顾本次的业务流程,相当于是多线程对同一个资源进行操作,而由于 MyBatis
自带的一级缓存和 SqlConnectionPool
连接池,导致异步任务的 sql
去查询时,每次都会使用同一个 connection
,然后查询语句就会匹配上缓存,且因为在同一个事务中 select
语句和 insert
语句执行之间会导致事务提交存在空挡。导致在服务端推送结果之后,sql
依旧查询不到结果。
引用
个人备注
此博客内容均为作者学习所做笔记,侵删!
若转作其他用途,请注明来源!