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

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

  2. 同样的问题,但涉及由定时服务触发的方法。


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


答案 1

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

像往常一样,事务以递归方式传播到所述方法中调用的所有bean以及这些bean调用的所有bean。当然,欢迎调用的其他 Bean 通过指定其他设置(例如 、 或 )来更改其方法调用的事务语义。@TransactionAttributeREQUIRES_NEWNOT_SUPPORTED

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

编辑:

更直接地回答编辑后的问题;通过 Java 事务 API 没有办法让一个事务跨越多个线程,因此在 EJB 中也没有办法。每个呼叫都与调用方的事务(如果有)完全断开连接。您基本上将获得新事务,无事务或异常,具体取决于您使用的内容。与 来自 的任何调用相同。@Asynchronous@TransactionAttributeTimerService


答案 2

来自 EJB 3.1 规范。

4.5.3 事务

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


推荐