服务器上存在的事务从不使用 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 事务并且不传播事务上下文。
我们使用 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 事务并且不传播事务上下文。