服务器上存在的事务从不使用 JTA="false" 调用 wildfly12?

Transaction present on server in Never call in wildfly12 with JTA="false"?

我们使用 wildfly12 并使用 jta=false 的数据源 在我们的 ejb 中,我们有事务属性 NEVER 但在调用另一个具有事务属性 NEVER 的 ejb class 期间抛出异常,异常如下:

Transaction present on server in Never call

根据下面link

我们知道我们不能从具有事务属性 NEVER 的 ejb 调用方法,但我们设置了 jta=false,我预计事务管理器不起作用。

不幸的是,在数据源设置的 jta=false 并不意味着事务没有启动。这意味着数据源不会成为事务的一部分。如果没有不同的说法,CTM EJB 组件在任何情况下都会启动事务。因此事务启动,然后事务上下文被传播到组件调用的任何 EJB 方法。 注意:事务可以在处理方法时暂停 (https://docs.oracle.com/cd/E19226-01/820-7627/bncik/index.html),但在方法完成时恢复。

回到jta=false案例。如果您在方法入口处设置 jta=false,CMT EJB 将启动全局事务。当您在方法中使用此类数据源时,该数据源未登记到全局事务中。这意味着所有数据更改都会立即提交。

如果你设置 jta=true 那么数据源被加入事务并且提交数据更改是 运行 在事务管理器说的时间(通常在 EJB 的末尾方法)。

如果您想调用用 TransactionAttributeType.NEVER 注释的方法,您确实需要确保原始方法执行 start/resume 事务并且不传播事务上下文。