java-Spring @Transactional是否使用任何Hibernate缓存?
作者:互联网
@Transactional
public MyEntity getEntity(long id) {
return dao.findOne(id);
//or select and update as well
}
每次我调用事务方法时:我是否将从休眠中获取任何缓存的实体(第一次除外)?还是我总是从数据库中获取新鲜的实体?
这一点很重要,因为我将拥有两个共享相同数据库的独立应用程序,并且我想确保休眠状态不返回任何缓存的实体,而另一个应用程序可能已经在后台更新了数据库中的同一实体.
解决方法:
如果这是服务层的事务边界,则Hibernate将创建一个新的Session,这意味着first level cache中没有任何内容.如果您尝试在同一服务方法中两次调用findOne方法,则第二次调用将从缓存中获取实体.
连续的服务方法调用(例如getEntity)总是以新的Hibernate会话结束,因此将从数据库中加载新的实体.
如果您使用第二级缓存并为此实体激活它,则Hibernate将始终首先命中缓存,并在缓存未命中时回退到数据库加载.
为防止数据完整性异常,无论如何请考虑使用optimistic locking.
标签:spring-transactions,hibernate,transactions,spring,java 来源: https://codeday.me/bug/20191120/2047218.html