当我在EJB中有@Asynchronous
方法时,我没有指定@TransactionAttribute
,那么容器究竟是如何处理事务边界的呢?显然,它不能使用调用线程的事务,那么它做什么呢?
同样的问题,但关于TimerService触发的方法。
答案 0 :(得分:44)
与MDB类似,事务是在容器启动之前,@Asynchronous
,@Schedule
或@Timeout
方法(和适用的拦截器)实际上是在方法之后调用并提交的(和拦截器完成。
按照惯例,事务传播到所述方法中调用的所有bean以及bean以递归方式调用的所有bean。当然,欢迎调用的其他bean通过指定其他@TransactionAttribute
设置(例如REQUIRES_NEW
或NOT_SUPPORTED
)来更改其方法调用的事务语义。
旁注,事务永远不会传播到@TransactionManagement(BEAN)
的bean。在调用Bean-Managed Transaction bean上的方法之前,容器将始终挂起正在进行的任何事务。
答案 1 :(得分:35)
来自EJB 3.1规范。
4.5.3交易
客户端事务上下文不会随异步方法调用一起传播。从Bean Developer的角度来看,从来没有从客户端流入事务上下文。这意味着,例如,异步方法上的REQUIRED事务属性的语义与REQUIRES_NEW完全相同。