特定の状態のデータベースからすべてのオブジェクトを読み取る 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)
ます。ただし、データベースに状態を設定するトランザクションは、ロックが解放された後にコミットされ、次の呼び出し元が同じオブジェクトを再度取得する可能性があります。
どうすればこれを防ぐことができますか?