关于JTA事务提交的疑问?

08-05-22 xmuzyu
         

在使用CMT的JTA时,每次调用一个业务方法之前(假设方法的事务属性是required),如果客户没有开启事务的话,容器就会新建一个事务,然后在业务方法结束的时候,提交或者回滚事务,问题是假如我在一个sessionBean的业务方法里调用了另一个sessionBean的业务方法,事务什么时候提交呢?是在调用另一个sessionBean的业务方法之前提交,还是等第二个业务方法结束后才提交事务。比如如下代码:orderProcess通过容器注入,

@EJB
OrderProcessFacade orderProcess;

public void processOrder(Customer customer) {

if(manager.contains(customer)){
customer.setCartItems(cartItems);
}else{
customer = manager.find(Customer.class, customer.getId());
customer.setCartItems(cartItems);
}

manager.merge(customer); // 1

orderProcess.processOrder(customer);



}

在上述方法里,外层processOrder方法所在的事务是在执行完manager.merge(customer)后提交,还是在执行orderProcess.processOrder(customer)后提交。
[该贴被xmuzyu于2008-05-22 18:44修改过]

         

Mrcaochong
2008-05-22 22:23


//第一种情况 没有采用事务代理模式(AOP编程)
第一个业务方法 开启事物
另一个业务方法(传递第一个业务方法开始事务的对象)
两个业务方法执行结束后 commit();否则一起rollback();


//第二种 采用事务代理模式
就不需要去担心什么时候该开启事务 什么时候提交事务

在代理类中统一开启事务 统一关闭

xmuzyu
2008-05-23 02:08

那CMT应该属于你所说的第二种方式,如果是第二种方式,我想弄清楚到底外层processOrder()所在的事务是什么时候结束的,EJB不支持嵌入式事务,所以我想应该是外层方法所在的事务先提交,然后内层方法在一个新的事务里执行,我这样理解对吗?请各位指点。多谢了。

banq
2008-05-26 10:31

>事务什么时候提交呢?
EJB事务在JBOss4中已经使用AOP拦截器实现,这就类似Spring的事务拦截器,都是在EJB方法执行之前激活事务,,方法结束后关闭事务,如果方法中有调用其他EJB,一般采取扁平事务,而不是嵌套事务,扁平事务就是将子事务纳入当前事务作为同一个事务。