为什么事务不提交,二级缓存就不会生效呢?
看下面的源代码
public class TransactionalCacheManager {
private final Map<Cache, TransactionalCache> transactionalCaches = new HashMap<>();
mybatis的二级缓存是由TransactionalCacheManager这个类来管理的,但是真正操作commit(),putObject的是TransactionalCache这个类。
那为什么事务不提交,二级缓存就不会生效呢?
//TransactionalCacheManager
public void commit() {
for (TransactionalCache txCache : transactionalCaches.values()) {
txCache.commit();
}
}
public void commit() {
if (clearOnCommit) {
delegate.clear();
}
flushPendingEntries(); //只有执行力commit才会执行该方法
reset();
}
//把数据写入缓存的方法
private void flushPendingEntries() {
for (Map.Entry<Object, Object> entry : entriesToAddOnCommit.entrySet()) {
delegate.putObject(entry.getKey(), entry.getValue());
}
for (Object entry : entriesMissedInCache) {
if (!entriesToAddOnCommit.containsKey(entry)) {
delegate.putObject(entry, null);
}
}
}
MyBatis的二级缓存由TransactionalCacheManager管理,TransactionalCache负责实际的提交操作。在事务未提交时,缓存不会生效,因为数据的最终状态依赖于事务的确定。当调用commit()时,pending_entries会写入缓存,确保数据一致性。如果配置了clearOnCommit,提交后还会清空缓存。
3万+

被折叠的 条评论
为什么被折叠?



