3

UserTransaction.getStatus() メソッドは、ロールバックまたはコミットを実行した直後でも、常に値 '6' を返します。ステータスが変化しない理由がわかりません。誰かがここで間違っていることを指摘できますか? WAS 6.1 を使用しています。

InitialContext context = new InitialContext();
UserTransaction utx = (UserTransaction)context.lookup("java:comp/UserTransaction");
System.out.println("Transaction status = "+utx.getStatus());  //value is 6

utx.begin()
//all work done here

if(all good) {utx.commit()}
else {
utx.rollback();
System.out.println("Transaction status = "+utx.getStatus());  //value is 6
}
4

2 に答える 2

11

アンドレアスはすでに答えを持っています。リストには STATUS_COMMITTED も含まれているため、STATUS_NO_TRANSACTION は完了したトランザクションの直感的な状態ではないと考えるかもしれない、私のような人々のために詳細を追加したいと思います。

EE6 javadoc にリストされているように、トランザクションが持つことができるすべての状態を次に示します。

STATUS_ACTIVE               0
STATUS_COMMITTED            3
STATUS_COMMITTING           8
STATUS_MARKED_ROLLBACK      1
STATUS_NO_TRANSACTION       6
STATUS_PREPARED             2
STATUS_PREPARING            7
STATUS_ROLLEDBACK           4
STATUS_ROLLING_BACK         9
STATUS_UNKNOWN              5

javadocs では、トランザクションの完了 (コミットまたはロールバック) 後に STATUS_NO_TRANSACTION が返されることが明確に述べられています。

static final int STATUS_NO_TRANSACTION
    No transaction is currently associated with the target object. 
    This will occur after a transaction has completed.

では、STATUS_ROLLEDBACK と STATUS_COMMITTED はいつ発生するのでしょうか。これら 2 つの状態に類似した Javadoc は、これらが何らかの問題のある状態に対応していることを明らかにしています。問題がなければ、代わりに STATUS_NO_TRANSACTION が返されます。

static final int STATUS_COMMITTED
    A transaction is associated with the target object and it has been committed. 
    It is likely that heuristics exist; otherwise, the transaction 
    would have been destroyed and NoTransaction returned.

経験則?

定義は次のとおりです。

ヒューリスティックな完了 (またはヒューリスティックな決定) は、更新をコミットまたはロールバックする分散トランザクションの完了段階で、リソースが一方的な決定を下したときに発生します。これにより、分散データが不確定な状態になる可能性があります。ヒューリスティックな完了の原因として、ネットワーク障害またはリソースのタイムアウトが考えられます。

つまり、簡単に言えば、おそらくネットワークやタイムアウトなどの一時的な状態が原因で、XA トランザクションに問題が発生したことを意味します。

けっこうだ。

また、WebSphere がこれらのヒューリスティックな完了を処理する方法は、アプリケーション サーバーのトランザクション プロパティの構成で概説されているヒューリスティック関連のプロパティを介して構成できることに注意してください。

于 2012-07-12T19:45:06.787 に答える
8

値 6 は を意味しSTATUS_NO_TRANSACTIONます。トランザクションの開始前、およびコミットまたはロールバック後にこの結果が得られるのは正常です。

于 2012-07-12T15:18:52.780 に答える