【问题标题】:UserTransaction.getStatus() always returns '6'UserTransaction.getStatus() 总是返回 '6'
【发布时间】:2012-07-11 19:32:50
【问题描述】:

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
}

【问题讨论】:

    标签: jakarta-ee transactions websphere


    【解决方案1】:

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

    这里是一个事务可以拥有的所有状态as listed in 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? 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.
    

    启发式?

    这是定义;

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

    这意味着,简单地说,您的 XA 事务出现问题,可能是由于网络、超时等瞬态条件造成的。

    很公平。

    另外,值得注意的是,WebSphere 如何处理这些启发式完成可以通过Configuring transaction properties for an application server 中概述的启发式相关属性进行配置

    【讨论】:

    • 我无法在此答案中提供的 javadoc 链接中看到状态说明。如果其他人正在寻找它们,您可以在here 和数值here 中看到它们。感谢您的出色回答!
    • 所以,用更少的话说:每次事务成功完成时,您都会得到 STATUS_NO_TRANSACTION。我是否正确理解这一点?这与逻辑所暗示的相反 - 例如。如果事务回滚,我希望收到 STATUS_ROLLEDBACK。
    【解决方案2】:

    值 6 表示STATUS_NO_TRANSACTION。在事务开始之前和提交或回滚之后得到这个结果是正常的。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-05-04
      • 1970-01-01
      • 2012-01-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多