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

发布时间 2023-10-23 18:33:46作者: 圣达菲古

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

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

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

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

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

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

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

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

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

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