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

Mik*_*zak 34 java ejb glassfish java-ee ejb-3.1

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

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


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

Dav*_*ins 45

一个MDB交易类似由容器只是你之前开始@Asynchronous,@Schedule@Timeout方法(适用拦截器)实际上被调用,并承诺方法(和拦截器)完成之后.

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

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

  • 请注意,这个答案似乎与下面的答案相反(可能取决于EJB版本). (3认同)
  • 很好的答案,也必须阅读两次.对于读这个的其他人(如上文和下文所述).为异步方法启动新的Transaction. (3认同)
  • @BillMan 呵呵,不用担心。有趣的交流。如果你必须读两遍,那可能仍然是我的错。:) (2认同)

小智 36

来自EJB 3.1规范.

4.5.3交易

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