Что означает состояние TERMINATED для UserTransaction в журналах Atomikos?


Я использую основные транзакции Atomikos в качестве TM в моем приложении J2SE.
У меня есть следующий код:

if (userTransaction.getStatus()== Status.STATUS_ACTIVE){
userTransaction.commit();
}

а затем я вижу в журналах следующее исключение:

java.lang.IllegalStateException: TM_UNIQUE_NAME0003000006 больше не активен, но находится в состоянии TERMINATED на com.atomikos.icatch.imp.CoordinatorImp.addParticipant (CoordinatorImp.java:615) на com.atomikos.icatch.imp. TransactionStateHandler.addParticipant (TransactionStateHandler.java:133) по адресу com.atomikos.icatch.imp.TransactionStateHandler.committed (TransactionStateHandler.java:347) по адресу com.atomikos.icatch.imp.TransactionStateHandler.comHandler:29.java.java.java.stateHandler.commit (транзакция). .atomikos.icatch.imp.CompositeTransactionImp.doCommit (CompositeTransactionImp.java:319) в com.atomikos.icatch.imp.CompositeTerminatorImp.commit (CompositeTerminatorImp.java:79) в com.atomikos.icatch.jta.Transaction .java: 236) на com.atomikos.icatch.jta.TransactionManagerImp.commit (TransactionManagerImp.java:496) на com.atomikos.icatch.jta.UserTransactionImp.commit (UserTransactionImp.java:129) на com.mycompany.module. view.myOtherClass. transformMpr (myOtherClass.java:57) в java.util.Observable.notifyObservers (Неизвестный источник) в com.mycompany.module.model.myClass.notifyObservers (myClass.java:291) в com.mycompany.module.model.myClass. MultiStateEscalation.run (myClass.java:91) в java.util.concurrent.Executors $ RunnableAdapter.call (Неизвестный источник) в java.util.concurrent.FutureTask $ Sync.innerRun (Неизвестный источник) в java.util.concurrent.FutureTask .run (Неизвестный источник) в java.util.concurrent.ScheduledThreadPoolExecutor $ ScheduledFutureTask.access $ 301 (Неизвестный источник) в java.util.concurrent.ScheduledThreadPoolExecutor $ ScheduledFutureTask.run (Неизвестный источник) в java. runTask (Неизвестный источник) в java.util.concurrent.ThreadPoolExecutor $ Worker.run (Неизвестный источник) в java.lang.Thread.run (Неизвестный источник)

Где строка 57 в myOtherClass - это строка, в которой я вызываю commit() в приведенном выше коде. userTransaction - это экземпляр UserTransaction.
Я не могу понять, что означает ПРЕКРАЩЕННЫЙ? Мне не удалось найти эти классы в дистрибутиве Atomikos (что странно, поскольку их исходный код открыт, и я дополнительно выполнил текстовый поиск строки по всем источникам), и завершение не является одним из статусов, определенных в javax.transaction.Status.
Имеет кто-то сталкивался с этим? Как я могу проверить, действительна ли удерживаемая мной userTransaction для фиксации?

Спасибо,
Иттай


person Ittai    schedule 19.12.2010    source источник


Ответы (1)


TERMINATED означает зафиксирован или откат. В вашем случае скорее всего таймаут / откат.

Если возможно, попробуйте увеличить время ожидания.

Как правило, проверка состояния транзакции не гарантирует, что следующая строка кода сможет выполнить фиксацию. Фиксация - это запрос приложения, который может завершиться ошибкой из-за тайм-аутов и проблем с ресурсами; иначе вам не понадобится двухфазная фиксация :-)

Лучший

person Guy Pardon    schedule 20.12.2010
comment
Спасибо. Два вопроса, если можно: 1) Предполагая, что это был тайм-аут (и он исчез после того, как я увеличил тайм-аут на основе ваших предложений на форуме Atomikos), был ли TX Active Xms до того, когда произошло IF? 2) Почему Atomikos выводит состояние, которое не соответствует таблице состояний JTA? На мой взгляд, это могло бы быть гораздо более полезным и не требующим пояснений. Еще раз спасибо за ваш вклад. - person Ittai; 21.12.2010