5


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

谢谢,
伊泰

4

1 回答 1

4

重复使用是可以的。

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

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

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

于 2010-11-23T13:50:58.447 回答