私のアプリケーションでは、2 つのスレッドが次のようにコード内の同じエンティティを更新しようとしています。
public static <T> T updateEntity(T entity, long id) {
long start = System.currentTimeMillis();
EntityManager em = null;
EntityTransaction tx = null;
try {
em = GenericPersistenceManager.emf.createEntityManager();
tx = em.getTransaction();
tx.begin();
entity = em.merge(entity);
tx.commit();
LoggerMultiplexer.logDBAccess(start, System.currentTimeMillis(),
String.format(OPERATION_UPDATE_ENTITY, entity.getClass().getName(), id));
return entity;
}
...
コミット行で重複キー エラーが発生することがあります。これは、スレッドが同時にエンティティを更新しようとしたときに発生すると思います。出来ますか?上記の関数に a を追加するsynchronized
と、重複キーの例外が発生しないため、そう思います。では、そのような同時実行の問題を考慮する必要がありますか? もしそうなら、複数のスレッドが同じオブジェクトを更新しようとしている場合、適切な方法は何でしょうか。