【发布时间】:2012-06-13 03:31:32
【问题描述】:
我处于以下情况。
有几个线程可以读取/更新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();
你能帮帮我吗?
【问题讨论】:
-
你可能必须明确地管理并发,类似的可以参考stackoverflow.com/q/2992463/366964
标签: hibernate jpa transaction-isolation