我可以在 commit() 之后重用 UserTransaction 实例吗?

Posted

技术标签:

【中文标题】我可以在 commit() 之后重用 UserTransaction 实例吗?【英文标题】:Can I reuse a UserTransaction instance after commit()? 【发布时间】:2011-05-14 09:57:40 【问题描述】:

下面代码中对 ut 实例的重用是否正确?

UserTransaction ut = (UserTransaction)ctx.lookup("java:comp/UserTransaction");  
ut.begin();  
doSomeWork();  
ut.commit();//Or rollback (I think it doesn't matter)  
ut.begin();   //Or rollback (I think it doesn't matter)  
doOtherWork();  
ut.commit();  

当 JNDI 资源这样定义时:

Reference atomikosUserTransactionFactoryDS = new Reference("com.atomikos.icatch.jta.UserTransactionImp", 
                "com.atomikos.icatch.jta.UserTransactionFactory", null);
atomikosUserTransactionFactoryDS.add(new RefAddr("name")   
public Object getContent()   
        return "UserTransaction";  
);  
atomikosUserTransactionFactoryDS.add(new RefAddr("type")   
    public Object getContent()   
    return "com.atomikos.icatch.jta.UserTransactionImp";  
);  
initContext.rebind("java:comp/UserTransaction", atomikosUserTransactionFactoryDS);

我不确定是否需要添加另一个查找,以便在开始新的 UserTransaction 之前从工厂检索新的 UserTransaction?

我认为这无关紧要,但正如资源定义所述,我使用 Atomikos 作为我的事务管理器(因此它是工厂作为工厂)。

谢谢, 伊泰

【问题讨论】:

一个动作应该做一件事并且只做一件事。你为什么要做多项事情,例如在一次调用中调用多个事务? 实际情况有点不同:它更像是一个 while(true) 循环,其中线程内部等待一个文件,当它找到一个文件时,它使用 ut.begin,ut.commit。在每次这样的迭代结束时,线程休眠,所以我在休眠之前提交事务,当它醒来时,如果有一个文件,那么就会有一个新的逻辑事务。当然,一旦找到文件,您就可以将代码重构为另一种获取 ut 并执行逻辑和提交的方法,但当前的设计不是我的,我只是想验证这不是不正确的。不过感谢您的评论。 【参考方案1】:

重复使用没问题。

UserTransaction 并不代表特定的事务实例,而是提供了一种管理当前线程事务上下文的方法。如果您愿意,可以将其视为单身人士。 UserTransaction 通常是无状态的。

事务的单个实例是一个独特的实体,通常用户代码不需要直接使用。为每个 tx 创建一个,不能重复使用。

如果你是一个休眠的人,那么考虑一下 SessionFactory 和 Session。

【讨论】:

以上是关于我可以在 commit() 之后重用 UserTransaction 实例吗?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 java 中的 con.commit() 之后刷新表?

如何在git里撤销任何操作

git commit之后,想撤销commit

git commit 之后,撤销commit操作

php mysql commit之后还可以rollback么

Eclipse使用EGit,commit之后仍显示NO HEAD的解决方法