Я новичок в JPA, так что прости меня, если не ясно.
По сути, я хочу предотвратить одновременные изменения с помощью Оптимистической блокировки.
Я добавил атрибут @Version в свой класс сущностей.
Мне нужно знать, работает ли этот алгоритм обработки OptimisticLockException.
Я собираюсь использовать Execute Around Idiom примерно так:
interface UpdateUnitOfWork
{
doUpdate( User user ); /* may throw javax.persistence.PersistenceException */
}
public boolean exec( EntityManager em, String userid, UpdateUnitOfWork work)
{
User u = em.find( User, userid );
if( u == null )
return;
try
{
work.doUpdate( u );
return true;
}
catch( OptimisticLockException ole )
{
return false;
}
}
public static void main(..) throws Exception
{
EntityManagerFactory emf = ...;
EntityManager em = null;
try
{
em = emf.createEntityManager();
UpdateUnitOfWork uow = new UpdateUnitOfWork() {
public doUpdate( User user )
{
user.setAge( 34 );
}
};
boolean success = exec( em, "petit", uow );
if( success )
return;
// retry 2nd time
success = exec( em, "petit", uow );
if( success )
return;
// retry 3rd time
success = exec( em, "petit", uow );
if( success )
return;
}
finally
{
em.close();
}
}
У меня вопрос, как вы решаете, когда прекратить повторные попытки?