Я в следующей ситуации.
Есть несколько потоков, которые могут читать/обновлять MonthlySales
постоянные объекты. Проблема в том, что эти объекты могут не существовать и должны создаваться динамически по запросу.
Таким образом, два разных потока в конечном итоге создают сущность, соответствующую одному и тому же ключу (т.е. имеющую одинаковый идентификатор), поэтому один из них не удалось зафиксировать. Я не хочу, чтобы это произошло. Я хотел бы, чтобы один из двух потоков выиграл гонку, а другой проиграл, ожидая, пока объект не будет создан другим.
Другими словами, я хочу выполнять сериализованные транзакции. Должен ли я поставить явную блокировку 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();
Вы можете помочь мне?