Я слышал, что при совершении транзакций с использованием диспетчера сущностей рекомендуется повторить попытку, если коммит не выполняется, поскольку это может быть проблема, когда объект был изменен во время обработки транзакции.Обработка исключений с помощью диспетчера сущностей
Это похоже на правильную реализацию повтора?
int loopCount = 1;
boolean transactionCommited = false;
while(!transactionCommited && loopCount <3) {
EntityManager em = EMF.getInstance().getEntityManager();
try{
EntityTransaction tx = em.getTransaction();
tx.begin();
Player playerToEdit = em.find(Player.class, id);
playerToEdit.setLastName(lastName);
tx.commit();
transactionCommitted = true;
} catch(Exception e){
if(loopCount == 2){
//throw an exception, retry already occurred?
}
} finally{
if(tx.isActive()){
tx.rollback();
}
em.close();
}
loopCount++;
}
В цикле я повторно читаю, как вы предлагаете, путем вызова Player playerToEdit = em.find (Player.class, id); Верный? – user1154644
Да, вы переделываете чтение. Но user2 не видел этих изменений (от user1), поэтому он просто перезаписывает изменения user1 !. –
, а какой тип исключения я должен улавливать при работе с EntityManager, чтобы убедиться, что что-то связанное с jpa/persistence связано? – user1154644