【发布时间】:2011-10-05 05:40:10
【问题描述】:
在我的 Web 应用程序中,我有几个线程可能同时访问相同的数据,因此我决定使用 Hibernate 实现乐观(版本控制)和悲观锁定。
目前我使用以下模式来锁定一个实体并对其执行写操作(使用 Springs 事务管理器和@Transactional 的事务划分):
@Transactional
public void doSomething(entity) {
session.lock(entity, LockMode.UPGRADE);
session.refresh(entity);
// I change the entity itself as well as entites in a relationship.
entity.setBar(...);
for(Child childEntity : entity.getChildren()) {
childEntity.setFoo(...);
}
}
但是,当@Transactional 正在刷新时,有时我会收到StaleObjectException,它告诉我 ChildEntity 已同时被修改并且现在版本错误。
我想我 没有正确刷新 entity 及其子项,所以我正在处理陈旧的数据。有人可以指出如何实现这一目标吗?我的一些想法包括清除持久性上下文(会话)或再次调用session.lock(entity, LockMode.READ),但我不确定这里的正确性。
感谢您的帮助!
【问题讨论】:
标签: java mysql hibernate spring jakarta-ee