Mybatis一级缓存
笔者的一些废话:为啥想写这个呢,前段时间做项目的时候,写了个bug,查了老半天没查出问题来,最后百度发现是因为mybatis一级缓存的问题,还是学艺不精啊,会用但是不懂原理,所以记录下自己的学习过程,希望与诸君共勉。
一、场景模拟
所谓的一级缓存,以我现在的理解,就是mybatis为了提高查询效率,在同一个SQL session中,执行两次相同的查询时,第一次查询结果会保存在缓存中,第二次查询时,将不再去查询数据库,直接从缓存中获取数据。看似很合理的设计,但是有些时候可能会存在问题,话不多说,直接上代码。
/** 线程1 负责根据userid查询用户user数据,在同一个SQL session内前后执行了两次相同的查询语句**/ @Test @Transactional//transactional注解是为了保证以下两条sql查询在同一个SQL session内(transactional注解是开启了事务管理,由spring统一开启事务提交事务,所以两条sql语句是在同一个SQL session内的,纯属个人理解,可能不是那么准确) void mybatisPlusTest() { //先根据userid查询用户信息 User user = userMapper.selectById(1759102324728455170L); //输出用户信息 System.out.println(user); //再根据userid查询用户信息,保证与第一次