异步方法的默认EJB事务模式?

时间:2010-10-25 15:29:26

标签: java java-ee glassfish ejb ejb-3.1

  1. 当我在EJB中有@Asynchronous方法时,我没有指定@TransactionAttribute,那么容器究竟是如何处理事务边界的呢?显然,它不能使用调用线程的事务,那么它做什么呢?

  2. 同样的问题,但关于TimerService触发的方法。


  3. 编辑:我想我说的很差。我已经知道默认模式是'REQUIRED'。因此,假设在事务中始终调用这些方法应该是安全的。但我的问题是,该交易的生命周期是什么样的?容器是否为每个调用创建一个新事务?或者它是否为异步工作线程上的所有调用重用相同的事务?如果是后者,那么交易什么时候关闭?

2 个答案:

答案 0 :(得分:44)

与MDB类似,事务是在容器启动之前,@Asynchronous@Schedule@Timeout方法(和适用的拦截器)实际上是在方法之后调用并提交的(和拦截器完成。

按照惯例,事务传播到所述方法中调用的所有bean以及bean以递归方式调用的所有bean。当然,欢迎调用的其他bean通过指定其他@TransactionAttribute设置(例如REQUIRES_NEWNOT_SUPPORTED)来更改其方法调用的事务语义。

旁注,事务永远不会传播到@TransactionManagement(BEAN)的bean。在调用Bean-Managed Transaction bean上的方法之前,容器将始终挂起正在进行的任何事务。

答案 1 :(得分:35)

来自EJB 3.1规范。

  

4.5.3交易

     

客户端事务上下文不会随异步方法调用一起传播。从Bean Developer的角度来看,从来没有从客户端流入事务上下文。这意味着,例如,异步方法上的REQUIRED事务属性的语义与REQUIRES_NEW完全相同。