Mybatis对缓存提供支持,是默认开启一级缓存。

来一段代码,这边使用的是mybatis-plus框架,通过构建 QueryWrapper 查询类来实现的。

     @Transactional
public ResData assginOrder1(List<SaleAssignData> assignlist) { //此处省略很多代码
LocalDateTime now = LocalDateTime.now();
assignlist.stream().forEach(data -> {
Integer projectId = data.getProjectId();
Integer count = data.getCount();
if(count != null && count >0){
List<OrderDetailDO> list = orderDetailMapper.selectList(new QueryWrapper<OrderDetailDO>()
.eq("project_id", projectId).eq("agent_id", userId)
.eq("status",0).orderByAsc("id").last("limit" + count)); Integer saleId = data.getUserId();
SysUserDO saleman = sysUserMapper.selectById(saleId); list.stream().forEach(orderDetailDO ->{
//此处list处理
});
orderDetailService.saveOrUpdateBatch(list);
}
}); //此处其他表操作 return new ResData();
}

如果传入的参数assignlist

[
{
"projectId":1,
"saleId":1,
"count":1
},
{
"projectId":1,
"saleId":2,
"count":1
}
]

在同一事务,两次查询条件,projectId和count值一样,原本认为第一次查询出的结果会被修改,可以顺利的修改成功。但事与愿违,两次查询得到的数据结果是一样,两次修改的是同一条数据,这就是因为mybatis一级缓存机制导致。

那么,怎么解决呢?以下提供两个方法

方法一:使用随机数方式,在sql处拼接一段随机数  【 .apply(num+"="+num) 】 ,让mybatis认为sql不一样

Random rn  = new  Random();
int num = rn.nextInt(100000);
List<OrderDetailDO> list = orderDetailMapper.selectList(new QueryWrapper<OrderDetailDO>().apply(num+"="+num)
.eq("project_id", projectId).eq("agent_id", userId)
.eq("status",0).orderByAsc("id").last("limit "+count));

方法二:springboot配置不使用一级缓存(默认是session级别),但是使用这种情况,一级缓存都不能使用,每次查询都要去数据库查询

mybatis.configuration.local-cache-scope=statement

这样就可以得到很好的解决。

mybatis一级缓存让我憔悴的更多相关文章

  1. MyBatis 一级缓存与二级缓存

    MyBatis一级缓存 MyBatis一级缓存默认开启,一级缓存为Session级别的缓存,在执行以下操作时一级缓存会清空 1.执行session.clearCache(); 2.执行CUD操作 3. ...

  2. MyBatis一级缓存引起的无穷递归

    MyBatis一级缓存引起的无穷递归 引言: 最近在项目中参与了一个领取优惠劵的活动,当多个用户领取同一张优惠劵的时候,使用了数据库锁控制并发,起初的设想是:如果多个人同时领一张劵,第一个到达的人领取 ...

  3. mybatis一级缓存详解

    mybatis缓存分为一级缓存,二级缓存和自定义缓存.本文重点讲解一级缓存 一:前言 在介绍缓存之前,先了解下mybatis的几个核心概念: * SqlSession:代表和数据库的一次会话,向用户提 ...

  4. 0065 MyBatis一级缓存与二级缓存

    数据库中数据虽多,但访问频率却不同,有的数据1s内就会有多次访问,而有些数据几天都没人查询,这时候就可以将访问频率高的数据放到缓存中,就不用去数据库里取了,提高了效率还节约了数据库资源 MyBatis ...

  5. MyBatis 一级缓存避坑

    MyBatis 一级缓存(MyBaits 称其为 Local Cache)无法关闭,但是有两种级别可选: package org.apache.ibatis.session; /** * @autho ...

  6. 关于mybatis 一级缓存引发的问题

    场景: 由于在一个方法中存在多个不同业务操作 private void insertOrUpdateField(CompanyReport entity) { //计算并数据 calcReportDa ...

  7. MyBatis一级缓存(转载)

    <深入理解mybatis原理> MyBatis的一级缓存实现详解 及使用注意事项 http://demo.netfoucs.com/luanlouis/article/details/41 ...

  8. MyBatis 一级缓存、二级缓存全详解(一)

    目录 MyBatis 一级缓存.二级缓存全详解(一) 什么是缓存 什么是MyBatis中的缓存 MyBatis 中的一级缓存 初探一级缓存 探究一级缓存是如何失效的 一级缓存原理探究 还有其他要补充的 ...

  9. Mybatis一级缓存和二级缓存总结

    1:mybatis一级缓存:级别是session级别的,如果是同一个线程,同一个session,同一个查询条件,则只会查询数据库一次 2:mybatis二级缓存:级别是sessionfactory级别 ...

随机推荐

  1. linux golden-dict个性化添加词典

    国内有道,百度等参考https://www.jianshu.com/p/9bf577335945如果和我一样,想要添加大名鼎鼎的韦氏词典英文词典,则地址如下https://www.merriam-we ...

  2. vue封装axios

    一.安装axios npm install --save axios 二.在src下面创建文件夹api=>api.js(接口集合)+http.js(封装的请求) 三.在main.js中引用api ...

  3. 正则表达式(R&Python)

    regular expression 1.R,strongly recommend this blog The table_info examples are following: du_mtime_ ...

  4. RPC框架实现(一) Protobuf的rpc实现

    概述 RPC框架是云端服务基础框架之一,负责云端服务模块之间的项目调用,类似于本地的函数调用一样方便.常见的RPC框架配带的功能有: 编解码协议.比如protobuf.thrift等等. 服务发现.指 ...

  5. [vijos1144]小胖守皇宫<树形dp>

    题目链接:https://vijos.org/p/1144 woc我竟然A了,这道经典的树形dp或者说是树形dp的入门题我终于过了,虽然之前做过一些树形dp的题,但是这题开始还是一脸懵逼,dp方程如何 ...

  6. 【开源项目系列】如何基于 Spring Cache 实现多级缓存(同时整合本地缓存 Ehcache 和分布式缓存 Redis)

    一.缓存 当系统的并发量上来了,如果我们频繁地去访问数据库,那么会使数据库的压力不断增大,在高峰时甚至可以出现数据库崩溃的现象.所以一般我们会使用缓存来解决这个数据库并发访问问题,用户访问进来,会先从 ...

  7. 深入解读ES6系列(一)

    ECMAScript 6(ES6)简介 前言: 哈喽小伙伴们,爱说'废'话的Z又回来了,欢迎来到Super IT曾的博客时间,我说啦这个月要带的福利,说了更的博客肯定不能水你们,要一起进步学习嘛,今天 ...

  8. A 修公路

    时间限制 : - MS   空间限制 : 65536 KB  评测说明 : 时限1000ms 问题描述 某岛国有n个小岛构成(编号1到n),该国政府想要通过n-1条双向公路将这些小岛连接起来,使得任意 ...

  9. 悟懂MapReduce,不纠结!

    在<谷歌 MapReduce 初探>中,我们通过统计词频的 WordCount 经典案例,对 Google 推出的 MapReduce 编程模型有了一个认识,但是那种认识,还只是停留在知道 ...

  10. Windows之wsl简单配置

    Windows的wsl是Windows环境下启动的一个Linux环境,通常我们安装的是Ubuntu版本. 1.安装和简单配置 这里推荐一个文章,按照文章一步一步完全做就行 https://www.ji ...