在阅读mybatis源码时,发现问题: 源码**org.apache.ibatis.executor.BaseExecutor#query** ,如下: protected int queryStack; public List query(MappedStatement ms, Object parameter, RowBounds rowBounds, ResultHandler resultHandler, CacheKey key, BoundSql boundSql) throws SQLException { ErrorContext.instance().resource(ms.getResource()).activity("executing a query").object(ms.getId()); if (closed) { throw new ExecutorException("Executor was closed."); } if (queryStack == 0 && ms.isFlushCacheRequired()) { clearLocalCache(); } List list; try { queryStack++; list = resultHandler == null ? (List) localCache.getObject(key) : null; if (list != null) { //处理Callable类型,还需要绑定IN/OUT参数 handleLocallyCachedOutputParameters(ms, key, parameter, boundSql); } else { //本地缓存没有结果,直接查询数据库 list = queryFromDatabase(ms, parameter, rowBounds, resultHandler, key, boundSql); } } finally { queryStack--; } if (queryStack == 0) { // ... codeA ... } return list; } 我无法明白这个queryStack变量的意义。 通过控制流程来看: 1. 假如这段代码允许多线程并发,那么int变量一定会出现线程安全问题。 2. 假如这段代码仅允许单线程跑,那么只可能是因为存在递归的情况,才需要引用int来记录stack,但是我跟代码半天,也没有发现哪里会递归。 有没有大佬讲讲啥时候这个方法会递归调用?或者是其他作用。