UserTransaction.getStatus()始终返回'6'

And*_*ndy 2 websphere transactions java-ee

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
}
Run Code Online (Sandbox Code Playgroud)

Kur*_*glu 10

安德烈亚斯已经有了答案.我想为像我这样的人添加一些细节,他们可能认为STATUS_NO_TRANSACTION不是完成事务的直观状态,因为我们在列表中也有一个STATUS_COMMITTED.

以下是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
Run Code Online (Sandbox Code Playgroud)

在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.
Run Code Online (Sandbox Code Playgroud)

那么我们什么时候有STATUS_ROLLEDBACK和STATUS_COMMITTED?类似于这两个状态的Javadocs揭示了这些状态对应于某种有问题的状态,如果没有问题,你会得到一个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.
Run Code Online (Sandbox Code Playgroud)

启发式?

这是定义;

当资源在分布式事务的完成阶段做出单方面决定以提交或回滚更新时,就会发生启发式完成(或启发式决策).这可以使分布式数据处于不确定状态.网络故障或资源超时是启发式完成的可能原因.

这意味着,简单地说,你的XA交易出了问题,可能是由于网络,超时等瞬态情况.

很公平.

此外,值得注意的是,WebSphere如何处理这些启发式完成可以通过为应用程序服务器配置事务属性中概述的与启发式相关的属性进行配置

  • 我无法在此答案中提供的javadoc链接中看到状态说明.如果其他人正在寻找它们,你可以在[这里](http://docs.oracle.com/javaee/6/api/javax/transaction/Status.html#STATUS_ACTIVE)和数值[这里]看到它们(http://docs.oracle.com/javaee/6/api/constant-values.html#javax.transaction.Status.STATUS_ACTIVE).谢谢你的答复! (3认同)

And*_*hen 8

值6表示STATUS_NO_TRANSACTION.在事务开始之前以及提交或回滚之后获得此结果是正常的.