问:
暂存区已经清空了,那为啥还可以通过暂存区找到相应的二级缓存?就算返回一个空值,通过delegate链式反应下去不是还能通过一级缓存或者底层的数据库进行查询?那还如何保证数据的一致性原则?
答:
在进行select操作时,经过cache链获取到了数据,在将要返回时,发现clearOnCommit已经被标记为true,那么会返回null,在CachingExecutor中有一个判断,如果在二级缓存中没有找到数据,就会进入BaseExecutor查询一级缓存,而一级缓存是会话级别的,在select时具有可重复读的特性(如果想要读已提交可以缩小一级缓存的控制域),但是在执行当前读操作时便会清空一级缓存,如果没有找到数据就会访问数据库。这恰恰是为了保证数据的一致性。