事情是这样的,测试发现有个查询接口,第一次调的时候没能返回数据,第二次调就可以正常返回。
这个接口的功能是查询用户的现有福利数据。具体点的逻辑是
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