MyBatis在事务中重复查询产生的缓存问题

工作开发中出现的问题, DAO层使用mybatis

  • 问题描述

产生该问题的业务是,   在一个事务的循环中重复执行一条查询,  返回结果类型为list

第一次查询的结果为空list, 对该list添加一条记录

第二次查询的结果也理应为空list, 但查询得到的返回值却是上次循环中对list进行手动添加后的结果

 

  • 产生原因

mybatis的一级缓存,mybatis会对查询的sql进行缓存, 查询在同一事务的前提下,mybatis对同一个session多次查询相同sql的情况, 会直接找上次查询的缓存, 不进行数据库查询

第一次查询的结果list被人为操作改变后, 第二次查询时, mybatis在缓存中查找, 返回了第一次查询的对象引用, 此时第一次查询的结果已被修改, 所以导致上述问题的出现

 

  • 解决方案

1. 对可能产生缓存的查询结果进行修改时, 不直接对其操作, 而是将结果值复制到中间变量上(注意! 复制值, 而不是引用), 对中间变量进行修改操作,  则不会产生上述问题

2. xml文件 的<select>标签添加 flushCache="true", 禁用此查询的一级缓存

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值