MyBatis二级缓存导致数据读取不一致问题解决方案

问题描述

SpringBoot + MyBatis 可读已提交不生效,先在SpringBoot查询出结果然后在数据库修改值后在Java再次读取,结果读取的还是修改之前的值。

原因分析

是MyBatis二级缓存导致的。

解决办法

方案一:使用SqlSession清除缓存

@Resource
private SqlSession sqlSession;
 
@Transactional(isolation = Isolation.READ_COMMITTED)
@Override
public void aaa() {
    SysLog log1 = this.getById("");
    log.info("log1【{}】", log1.getLogContent());
    sqlSession.clearCache();
    SysLog log2 = this.getById("");
    log.info("log2【{}】", log2.getLogContent());
}

方案二:使用SqlSessionTemplate清除缓存

@Resource
private SqlSessionTemplate sqlSessionTemplate;
 
@Transactional(isolation = Isolation.READ_COMMITTED)
@Override
public void aaa() {
    SysLog log1 = this.getById("");
    log.info("log1【{}】", log1.getLogContent());
    sqlSessionTemplate.clearCache();
    SysLog log2 = this.getById("");
    log.info("log2【{}】", log2.getLogContent());
}

方案三:在SQL查询中禁用缓存

<select id="getById" resultType="SysLog" useCache="false">
    SELECT * FROM sys_log WHERE id = #{id}
</select>