我有一个 Singleton-EJB,它从具有特定状态的数据库中读取所有对象。然后我对这些对象做一些事情并将状态设置为其他:
@Singleton
public class MyEJB {
@PersistenceContext(unitName = "MyPu")
private EntityManager em;
@Lock(LockType.WRITE)
public void doSomeStuffAndClose() {
List<MyObj> objects = getAllOpenObjects();
for (MyObj obj : objects) {
// do some stuff here...
obj.setClosed(true);
}
}
private List<MyObj> getAllOpenObjects() {
TypedQuery<MyObj> q = em.createQuery("select o from MyObj o "
+ "where o.closed = false", MyObj.class);
return q.getResultList();
}
}
现在,如果我想确保不能同时调用我的方法,我添加注释@Lock(LockType.WRITE)
。但是在数据库中设置状态的事务是在释放锁之后提交的,并且下一个调用者可能会再次获取相同的对象。
我怎么能防止这种情况?