在同一个sqlSession执行一个相同的查询时,Mybatis有一级缓存,不会去查数据库,由此引发的一个bug

 

 此场景是一个线程入库result,另外有一个线程在查result表,看是否有待执行的result

Mybatis对缓存提供支持,但是在没有配置的默认情况下,它只开启一级缓存,一级缓存只是相对于同一个SqlSession而言。所以在参数和SQL完全一样的情况下,我们使用同一个SqlSession对象调用一个Mapper方法,往往只执行一次SQL,因为使用SelSession第一次查询后,MyBatis会将其放在缓存中,以后再查询的时候,如果没有声明需要刷新,并且缓存没有超时的情况下,SqlSession都会取出当前缓存的数据,而不会再次发送SQL到数据库。

所以这段代码在3这里会有问题,可使用其他方式判断待执行的result,或者去掉第一层判断,直接使用2,3判断,或者在对应的select标签里加上flushCache="true"。

posted on 2020-05-26 10:42  风再起时9302  阅读(1889)  评论(0编辑  收藏  举报

导航