工作开发中出现的问题, DAO层使用mybatis
-
问题描述
产生该问题的业务是, 在一个事务的循环中重复执行一条查询, 返回结果类型为list
第一次查询的结果为空list, 对该list添加一条记录
第二次查询的结果也理应为空list, 但查询得到的返回值却是上次循环中对list进行手动添加后的结果
- 产生原因
mybatis的一级缓存,mybatis会对查询的sql进行缓存, 查询在同一事务的前提下,mybatis对同一个session多次查询相同sql的情况, 会直接找上次查询的缓存, 不进行数据库查询
第一次查询的结果list被人为操作改变后, 第二次查询时, mybatis在缓存中查找, 返回了第一次查询的对象引用, 此时第一次查询的结果已被修改, 所以导致上述问题的出现
- 解决方案
1. 对可能产生缓存的查询结果进行修改时, 不直接对其操作, 而是将结果值复制到中间变量上(注意! 复制值, 而不是引用), 对中间变量进行修改操作, 则不会产生上述问题
2. xml文件 的<select>标签添加 flushCache="true", 禁用此查询的一级缓存