2 Stimmen

Was bedeutet der Status "TERMINATED" von UserTransaction in den Atomikos-Protokollen?

Ich verwende Atomikos essential transactions als mein TM in meiner J2SE-Anwendung.
Ich habe den folgenden Code:

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

und dann sehe ich in den Protokollen die folgende Ausnahme:

java.lang.IllegalStateException: TM_UNIQUE_NAME0003000006 ist nicht mehr aktiv, aber im Zustand ABGESCHLOSSEN unter com.atomikos.icatch.imp.CoordinatorImp.addParticipant(CoordinatorImp.java:615) bei com.atomikos.icatch.imp.TransactionStateHandler.addParticipant(TransactionStateHandler.java:133) at com.atomikos.icatch.imp.TransactionStateHandler.committed(TransactionStateHandler.java:347) at com.atomikos.icatch.imp.TransactionStateHandler.commit(TransactionStateHandler.java:298) at com.atomikos.icatch.imp.CompositeTransactionImp.doCommit(CompositeTransactionImp.java:319) bei com.atomikos.icatch.imp.CompositeTerminatorImp.commit(CompositeTerminatorImp.java:79) at com.atomikos.icatch.jta.TransactionImp.commit(TransactionImp.java:236) bei com.atomikos.icatch.jta.TransactionManagerImp.commit(TransactionManagerImp.java:496) at com.atomikos.icatch.jta.UserTransactionImp.commit(UserTransactionImp.java:129) bei com.mycompany.module.view.myOtherClass.transformMpr(myOtherClass.java:57) at java.util.Observable.notifyObservers(Unbekannt Source) at com.mycompany.module.model.myClass.notifyObservers(myClass.java:291) at com.mycompany.module.model.myClass.MultiStateEscalation.run(myClass.java:91) bei java.util.concurrent.Executors$RunnableAdapter.call(Unbekannt Source) at java.util.concurrent.FutureTask$Sync.innerRun(Unbekannt Source) at java.util.concurrent.FutureTask.run(Unbekannte Quelle) at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.access$301(Unknown Quelle) at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(Unknown Quelle) bei java.util.concurrent.ThreadPoolExecutor$Worker.runTask(Unbekannte Quelle) bei java.util.concurrent.ThreadPoolExecutor$Worker.run(Unbekannte Quelle) bei java.lang.Thread.run(Unbekannte Quelle)

Wo Zeile 57 in der myOtherClass ist die Zeile, in der ich die commit() in dem obigen Code. userTransaction ist eine Instanz von UserTransaction .
Was ich nicht verstehen kann, ist, was die ABGESCHLOSSEN bedeutet? Ich konnte diese Klassen in der Atomikos-Distribution nicht finden (was seltsam ist, da sie quelloffen sind und ich zusätzlich eine Textsuche nach der Zeichenkette über alle Quellen durchgeführt habe) und terminiert ist nicht einer der Status, die in javax.transaction.Status .
Hat jemand diese Erfahrung gemacht? Wie kann ich überprüfen, ob die userTransaction, die ich habe, für die Übertragung gültig ist?

Danke,
Ittai

2voto

Guy Pardon Punkte 484

TERMINATED bedeutet "committed" oder "rolled back". In Ihrem Fall handelt es sich höchstwahrscheinlich um einen Timeout/Rollback.

Versuchen Sie, den Timeout zu erhöhen, wenn Sie können.

Im Allgemeinen garantiert die Überprüfung des Transaktionsstatus nicht, dass die nächste Codezeile übertragen werden kann. Das Commit ist eine Anwendungsanforderung, die aufgrund von Timeouts und Ressourcenproblemen fehlschlagen kann; sonst bräuchte man kein Two-Phase-Commit :-)

Am besten

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X