首页 > 其他分享 >mybatis的一级缓存和事务注解失效导致的查询结果缺失

mybatis的一级缓存和事务注解失效导致的查询结果缺失

时间:2023-10-23 18:37:03浏览次数:38  
标签:缓存 步骤 调用 mybatis 注解 子表

事情是这样的,测试发现有个查询接口,第一次调的时候没能返回数据,第二次调就可以正常返回。

这个接口的功能是查询用户的现有福利数据。具体点的逻辑是

  1,查询数据库,mybatis,xml里面写的关联查询,主表和子表关联。

  2,判断查询结果,如果没有子表部分的信息,则按照业务逻辑生成子表数据,落库。如果有子表数据,则跳过

  3,查询数据库,和步骤1同一个mybatis接口,补充组装别的业务信息。

第一次调用的时候就是会走步骤2里面的没有子表部分信息的逻辑,这之后走步骤3,就会查不到子表部分信息。

后面发现是mybatis的一级缓存和事务注解失效导致的。

首先,是在service层同一个实现类里面调用实现步骤1,2,3的方法,这样就是方法内部的普通调用,并不是调用的代理对象,所以方法上的事务注解没有生效。

再一个mybatis的一级注解是sqlsession级别,再一个事务中都是能够命中缓存的,除非中间进行过增删改操作。

步骤1和3中的mybatis接口是同一个,由于事务注解失效了,所有都在一个事务中,步骤3再次调用时命中mybatis一级缓存,查到的结果和步骤1的结果一样。第二次调用这个接口时,步骤1查到的就是完整的数据,因此结果是对的。

标签:缓存,步骤,调用,mybatis,注解,子表
From: https://www.cnblogs.com/xicaicong/p/17783164.html

相关文章

  • 自定义MyBatis拦截器更改表名
    byemanjusakafrom​https://www.emanjusaka.top/archives/10彼岸花开可奈何本文欢迎分享与聚合,全文转载请留下原文地址。自定义MyBatis拦截器可以在方法执行前后插入自己的逻辑,这非常有利于扩展和定制MyBatis的功能。本篇文章实现自定义一个拦截器去改变要插入或者查询......
  • MyBatis-Plus和shardingsphere一起用。子查询取别名读取不到的问题。
    https://github.com/baomidou/mybatis-plus/issues/2585在使用MP和Shardingsphere的某些版本中,可能会出现join子查询表取别名之后,在where中用这个别名报错 Cannotfindownerfromtable.//重点是外层SQL不要出现*,不要使用别名,需要的字段都写清楚(内外层sql都要写清楚),......
  • 什么是缓存雪崩
    在同一时间大量请求同一个接口,接口就会不断的查询数据库,就会导致缓存的雪崩; 解决办法:在基础时间的基础上,再加上一个随机的过期时间比如10-15s; ps:不要使用newRandom生成随机数,因为大量的随机数使用newRandom可能会导致生成同一个数值;......
  • 如何使用MyBatis-Plus实现字段的自动填充?一文教会你
    环境说明:Windows10+Idea2021.3.2+Jdk1.8+SpringBoot2.3.1.RELEASE前言在实际的开发过程中,我们经常需要在进行数据库操作时自动填充某些字段值,比如创建时间,更新时间等。手动填充虽然可行,但是容易出错,并且代码冗余,影响开发效率。MyBatis-Plus提供了字段自动填充的功能,可以......
  • C#WebApi 对数据进行缓存加快前请求数据的速度
    usingClassLibrary1;usingClassLibrary2;usingMicrosoft.AspNetCore.Mvc;usingMicrosoft.Extensions.Caching.Memory;usingMicrosoft.Extensions.Logging;usingWebApplication1.IServices;usingWebApplication1.Utility.SwaggerExt;namespaceWebApplication1.......
  • Mybatis-Plus 语句日志输出
    两种方式都是在yml文件下配置第一种方式:mybatis-plus:configuration:log-impl:org.apache.ibatis.logging.stdout.StdOutImpl这种方式会将数据也一块输出出来,遇到查询较多数据的情况会导致看不到sql语句第二种方式:logging:level:com:***......
  • Java 自定义脱敏注解实现
    自定义注解packagecom.yunmeng.iot.common.desensitization.annotation;importcom.fasterxml.jackson.annotation.JacksonAnnotationsInside;importcom.fasterxml.jackson.databind.annotation.JsonSerialize;importcom.yunmeng.iot.common.desensitization.enums.Secr......
  • celery包结构、celery延迟任务和定时任务、django中使用celery、接口缓存、双写一致性
    celery包结构project├──celery_task#celery包│├──__init__.py#包文件│├──celery.py#celery连接和配置相关文件,且名字必须叫celery.py│└──tasks.py#所有任务函数├──add_task.py#添加任务......
  • redis其他操作、redis管道、django中使用redis、django缓存、celery介绍、补充单例
    redis其他操作'''delete(*names)exists(name)keys(pattern='*')expire(name,time)rename(src,dst)move(name,db))randomkey()type(name)'''#redis的key值,最大可以是多少?最大不超过512M一般1KB#redis的value值,最大可以是多少?最大不超过512M......
  • 5、单元测试、反射、注解、动态代理
    单元测试、反射、注解、动态代理一、单元测试1.1Junit单元测试所谓单元测试,就是针对最小的功能单元,编写测试代码对其进行正确性测试。我们想想,咱们之前是怎么进行测试的呢?比如说我们写了一个学生管理系统,有添加学生、修改学生、删除学生、查询学生等这些功能。要对这些功能......