以下代码中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作为我的事务管理器(因此,工厂就是工厂)。

谢谢,
伊泰

最佳答案

可以重用。

UserTransaction不代表特定的事务实例,而是提供一种管理当前Thread的事务上下文的方式。如果愿意,可以将其视为单例。 UserTransaction通常是无状态的。

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

如果您是一个 hibernate 的人,那么请考虑SessionFactory和Session。

10-01 22:27