最近有一个方法返回的结果与预想的不一致。
原因:mybatis的一级缓存导致的问题
该方法内部重复调用同一个mybatis的方法,因为入参相同触发一级缓存。
举个例子:
@Transactional
// 执行查询,结果将被缓存
YourObject object1 = mapper.selectByPrimaryKey(id);
// 再次执行相同的查询,可能从缓存中获取结果
YourObject object2 = mapper.selectByPrimaryKey(id);
// 检查缓存中的对象是否与数据库中的对象相同
// 如果object1和object2是同一个对象,则表示使用了一级缓存
System.out.println(object1 == object2);
因为object1和object2是同一个对象,修改了object1导致 object2也进行修改。 所以获取的结果有差异。
解决方法:去掉@Transactional。或者对object1进行copy生成新的对象,不对object1进行更改。
551

被折叠的 条评论
为什么被折叠?



