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

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


编辑:我认为我的措辞很糟糕。我已经知道默认模式是“需要”。因此可以安全地假设这些方法将始终在事务中调用。但我的问题是,该交易的生命周期是什么样的?容器是否为每个调用创建一个新事务?或者它是否对异步工作线程上的所有调用重复使用相同的事务?如果是后者,那么交易何时关闭?

4

2 回答 2

46

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

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

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

编辑:

更直接地回答编辑过的问题;Java Transaction API 没有办法让一个事务跨越多个线程,因此在 EJB 中也没有办法。每个@Asynchronous呼叫都与呼叫者的事务完全断开(如果有的话)。根据您使用的内容,您基本上会获得新交易、无交易或异常@TransactionAttribute。与来自TimerService.

于 2010-10-27T01:06:52.103 回答
37

来自 EJB 3.1 规范。

4.5.3 交易

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

于 2011-03-07T13:16:23.050 回答