我处于以下情况。
有几个线程可以读取/更新MonthlySales
持久对象。问题是这些对象可能不存在并且必须根据请求动态创建。
因此,两个不同的线程最终创建了对应于相同键(即具有相同 ID)的实体,因此其中一个线程无法提交。我不希望这种情况发生。我希望两个线程中的一个赢得比赛,另一个松散,等到另一个线程创建了对象。
换句话说,我确实想做序列化交易。我应该放置一个显式的 Java 锁(即synchronized
块)吗?
我当前的代码如下:
MonthlySales ms = entityManager.find(MonthlySales.class, somekey);
if (ms == null) { // two threads might enter this block altogether
ms = new MonthlySales();
// prepare ms object populating its fields with default values
entityManager.persist(ms);
entityManager.flush();
}
entityManager.lock(ms, LockModeType.PESSIMISTIC_WRITE); // lock this object
// since we are going to update it
// do something with ms object
entityManager.getTransaction().commit();
entityManager.close();
你能帮助我吗?