Повторный запуск неудачных транзакций, управляемых контейнером, в Java EE - PullRequest
1 голос
/ 30 июня 2010

У меня ситуация с устаревшей системой, которая использует управляемые транзакции Java EE Bean.Он получает LockAcquisitionException, когда он пытается получить что-то, что он только что создал.

Мои первоначальные мысли были такими:

@TransactionAttribute(SUPPORTS)
public Item retrieveItem(int id) {
 Item i;
 try {
   i = em.find(Item.class, id);
 } catch (PersistenceException e) {
   if (e.getCause() instanceof LockAcquisitionException) {
     i = retrieveItem(id);
   }
 }
 return i;
}

Однако - когда выполняется рекурсивный вызов, транзакция ужеумер - и это, кажется, не создает новый.Я пробовал разные TransactionAttributes, но, похоже, это не имеет значения.Также пытался самостоятельно управлять транзакцией (em.getTransaction()), но в CMT это незаконно.

Я не ищу элегантного исправления - как я уже сказал, это наследие, мне просто нужно что-то, что будет сортировать егопока все не будет заменено через пару месяцев!

Приветствия.

Ответы [ 2 ]

1 голос
/ 30 июня 2010

Попытайтесь аннотировать retrieveItem с помощью @TransactionAttribute(REQUIRES_NEW): затем он будет выполнен в новой транзакции.

Обратите внимание, что:

  1. первый был признан недействительным (установлен для отката) и никогда не завершится
  2. во время второй транзакции, изменения, сделанные в первой транзакции, все равно не видны

Так что я не знаю, подходит ли это вашему сценарию.Но я знаю, что это единственный способ выполнить операцию и зафиксировать ее успешно, если исходная транзакция была признана недействительной.

0 голосов
/ 01 июля 2010

К сожалению, единственный способ найти это - это исправить причину транзакции - теперь я делаю em.flush() в начале retrieveItem().Не могу дождаться, чтобы заменить это приложение ..

...