2


J2SE アプリケーションで Atomikos エッセンシャル トランザクションを TM として使用しています。
次のコードがあります。

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.commit(TransactionStateHandler.java:298) com.atomikos.icatch.imp.CompositeTransactionImp.doCommit(CompositeTransactionImp.java:319) com.atomikos. icatch.imp.CompositeTerminatorImp.commit(CompositeTerminatorImp.java:79) com.atomikos.icatch.jta.TransactionImp.commit(TransactionImp.java:236) com.atomikos.icatch.jta.TransactionManagerImp.commit(TransactionManagerImp.java: 496) com.atomikos.icatch.jta.UserTransactionImp.commit(UserTransactionImp.java:129) com.mycompany.module.com.mycompany.module.model.myClass.notifyObservers(myClass.java:291) の java.util.Observable.notifyObservers (不明なソース) の view.myOtherClass.transformMpr(myOtherClass.java:57)。 model.myClass.MultiStateEscalation.run(myClass.java:91) で java.util.concurrent.Executors$RunnableAdapter.call(不明なソース) で java.util.concurrent.FutureTask$Sync.innerRun(不明なソース) で java.util java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.access$301 の .concurrent.FutureTask.run(不明なソース) java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(不明なソース) で java.util.concurrent. ThreadPoolExecutor$Worker.runTask(不明なソース) java.util.concurrent.ThreadPoolExecutor$Worker.run(不明なソース) で java.lang.Thread.実行 (不明なソース)

の 57行目は、上記のコードでmyOtherClass呼び出す行です。commit()userTransaction は のインスタンスですUserTransaction私が理解できないのは、 TERMINATED
と はどういう意味ですか? Atomikos ディストリビューションでこれらのクラスを見つけることができませんでした (これらのクラスはオープン ソースであり、さらにすべてのソースで文字列のテキスト検索を実行したため奇妙です)、終了は で定義されているステータスの 1 つではありません。 誰かがこれに遭遇しましたか?保持している userTransaction が commit に対して有効かどうかを確認するにはどうすればよいですか? javax.transaction.Status

ありがとう、
イッタイ

4

1 に答える 1

2

TERMINATEDは、コミットまたはロールバックされたことを意味します。あなたの場合、おそらくタイムアウト/ロールバックです。

可能であれば、タイムアウトを増やしてみてください。

一般に、トランザクションの状態を確認しても、コードの次の行がコミットできることは保証されません。コミットは、タイムアウトやリソースの問題が原因で失敗する可能性のあるアプリケーション要求です。それ以外の場合は、2フェーズコミットは必要ありません:-)

一番

于 2010-12-20T20:42:23.753 に答える