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

时间:2010-11-23 11:10:36

标签: java transactions jta atomikos


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

谢谢,
以太

1 个答案:

答案 0 :(得分:3)

重用是可以的。

UserTransaction不代表特定的事务实例,而是提供管理当前Thread的事务上下文的方法。如果你愿意,可以把它想象成一个单身人士。 UserTransaction通常是无状态的。

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

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