2010-12-19 5 views
2


Ich verwende Atomikos wesentliche Transaktionen als mein TM in meiner J2SE-Anwendung.
Ich habe den folgenden Code:Was bedeutet der Status "TERMINATED" von UserTransaction in Atomikos-Protokollen?

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

und dann die folgende Ausnahme in den Protokollen sehe ich:

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

Wo Zeile 57 in der myOtherClass ist die Zeile, wo ichaufrufenim obigen Code. userTransaction ist eine Instanz von UserTransaction.
Was ich nicht verstehen kann ist, was bedeutet TERMINATED bedeutet? Ich konnte diese Klassen in der Atomikos-Verteilung nicht finden (was seltsam ist, da ihre Open Source und ich zusätzlich eine Textsuche für die Zeichenfolge über alle Quellen ausgeführt haben) und beendet ist nicht einer der in javax.transaction.Status definierten Status.
Hat jemand das gefunden? Wie kann ich überprüfen, ob die userTransaction, die ich halte, für das Commit gültig ist?

Danke,
Ittai

Antwort

2

BEENDET Mittel begangen oder zurückgerollt. In Ihrem Fall wahrscheinlich ein Timeout/Rollback.

Versuchen Sie, die Zeitüberschreitung zu erhöhen, wenn Sie können.

Im Allgemeinen garantiert die Überprüfung des Transaktionszustands nicht, dass die nächste Codezeile festgeschrieben werden kann. Commit ist eine Anwendungsanforderung, die aufgrund von Timeouts und Ressourcenproblemen fehlschlagen kann. sonst würden Sie nicht zweiphasig-commit benötigen :-)

Beste

+0

Danke. Zwei Fragen, wenn ich darf: 1) Angenommen, es war ein Timeout (und es ging weg, sobald ich das Timeout aufgrund Ihrer Vorschläge im Atomikos-Forum erhöhte) war das TX Active Xms vor, als das 'IF' stattfand? 2) Warum gibt Atomikos einen Zustand aus, der nicht mit der JTA Statustabelle korreliert? Es könnte meiner Meinung nach viel hilfreicher und selbsterklärender sein. Nochmals vielen Dank für Ihre Eingabe. – Ittai