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. redhat7安装

    ------------恢复内容开始------------ 新建虚拟机向导(自定义) 指定虚拟机安装位置,把他放在固态硬盘提升他的运行速度(不推荐,一般将位置定为非系统盘) 选择系统镜像文件 开机选 ...

  2. 【洛谷】P2444 [POI2000]病毒——AC自动机

    题目链接 题目描述 二进制病毒审查委员会最近发现了如下的规律:某些确定的二进制串是病毒的代码.如果某段代码中不存在任何一段病毒代码,那么我们就称这段代码是安全的.现在委员会已经找出了所有的病毒代码段, ...

  3. Spark作业提交至Yarn上执行的 一个异常

    (1)控制台Yarn(Cluster模式)打印的异常日志: client token: N/A         diagnostics: Application application_1584359 ...

  4. BFC是什么?BFC有什么用?看完全明白

    一.BFC是什么? 官方定义 BFC(Block Formatting Context,块格式化上下文) 是Web页面的可视化CSS渲染的一部分,是块盒子的布局过程发生的区域,也是浮动元素与其他元素交 ...

  5. Oracle client客户端简易安装网上文档一

    Oracle client客户端简易安装网上文档一-------------------------------------------------------------------------一. ...

  6. 在Windows Python3.4 上安装NumPy、Matplotlib、SciPy和IPython

    NumPy 下载地址: http://sourceforge.net/projects/numpy/files/NumPy/1.8.1/ SciPy 下载地址: http://sourceforge. ...

  7. 一个完整的机器学习项目在Python中的演练(二)

    大家往往会选择一本数据科学相关书籍或者完成一门在线课程来学习和掌握机器学习.但是,实际情况往往是,学完之后反而并不清楚这些技术怎样才能被用在实际的项目流程中.就像你的脑海中已经有了一块块"拼 ...

  8. vue+express+mongodb 实现 增删改查

    一.创建一个vue项目 用脚手架vue-cli搭建一个项目,数据请求用axios方式,写几个按钮用来调接口(vue这块不做多解释,不懂的可以先去官网学习vue-cli:https://cli.vuej ...

  9. MATLAB GUI设计(1)

    一.新建GUI 1.命令行窗口输入 guide会出来如下界面,可以新建空白GUI,也可以打开已有GUI 2.通过工具栏新建 二.数据传递例子 1.添加输入框按钮,设置尺寸大小,内容,格式,标签 2.复 ...

  10. C/C++知识总结 五 复合数据类型 壹(数组、字符串与string、结构)

    C/C++复合数据类型 壹(数组.结构) 数组 数组的意义.定义与创建 一.二维数组应用 字符数组与字符串处理函数 数组与指针---关系密切 数组的意义与定义创建 意义:反映数据间的特点(通过把同一类 ...