修改查询结果导致脏读问题的保护性拷贝方案 和关闭Mybatis缓存方案对比

由于业务需求,需开发一个复杂查询页面。

 

最外层是车主数据,每个车主可展开列表查看车主名下的车辆信息,点击更多可查看车辆的多段包期。

实现过程为,先通过筛选项停车库、车主姓名、车牌号码、所属组织、在场状态、占位状态关联表查询出车主数据Result1,所用sql为SQL1;再通过停车库、SQL1查出的车主、车牌号码、在场状态、占位状态关联表查询出所有车辆信息,所用sql为SQL2,填充到Result1相应字段中(此过程称为PROCESS1),变成Result2。如下图:

 

但由于车位数、剩余车位数是属于车主的数据,应与筛选项车牌号码、在场状态、占位状态无关,不应随着车辆查询结果变动。所以应再需忽略车牌号码、在场状态、占位状态筛选项,对车辆信息再一次进行查询,得到的结果用来计算车位数和剩余车位数,填充到结果中。过程为再次调用SQL1获取车主数据Result3,再根据停车库、SQL1查出的车主关联表查询出所有车辆信息,所用sql为SQL3,填充到Result3相应字段中(此过程称为PROCESS2),变成Result4。最后在Result2合并封装转化为最终返回结果过程中,将Result4计算出的车位数、剩余车位数填充到结果中。如下图:

 

然而遇到一个问题,最终得到的结果中,有效期数据均多了重复的一份。

 

在原本的想象中,Result3的数据应与Result1相同,Result2的数据应该不受后续查询结果的影响。然而Result2的数据被后续操作修改了,有效期数据多了重复的一份,而经过调试发现,Result3的数据也与Result1不同。

 

调试得知是再次调用SQL1获取车主数据Result3时出了问题,得到的其实是Result2对象。因为Result2对象是直接修改Result1对象得到的,而Mybatis默认开启了一级缓存,当在同一个SQLSession中,查询语句和参数均相同时,会使用缓存,不再次进行SQL查询,直接使用上次查询结果,而上次查询结果被修改为了Result2。在Result2上进行操作,使得PROCE

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值