我很难理解我应该如何处理在 Jboss EAP 7 实例上运行的 JTA 和 CDI。我可以通过注入来自容器的 UserTransaction 对象来手动获取事务,但是当我使用 @Transactional 注释该方法时,我得到一个关于没有可用事务的异常......我的问题是。是否缺少任何配置?我简要地阅读了也许我应该自己创建一个拦截器以使其工作,但我还没有找到任何一致的例子......
问问题
615 次
1 回答
0
在默认的 JEE 容器管理环境中,只有企业 bean(通常@Stateless
使用 bean)是事务性的。一旦你从外部输入这样一个 bean,事务就会打开。使用@javax.transaction.Transactional
注释,您可以控制事务的行为,但在默认情况下这不是必需的。
示例豆:
@Stateless
public MyBean {
public void withinTransaction() {
System.out.println("i'm running within a transaction");
}
@Transactional(TxType.NOT_SUPPORTED)
public void outsideTransaction() {
System.out.println("no transaction available...");
}
}
- 如果您
MyBean.withinTransaction
从 Servlet 调用(例如通过 REST),则会创建一个新事务(如果尚不存在)。 - 如果您调用
MyBean.outsideTransaction
,则不会创建任何事务。 - 如果您调用
this.outsideTransaction()
fromwithinTransaction
,您仍然可以使用事务outsideTransaction
(因为拦截器仅绑定到 bean 边界) - 如果您
this.withinTransaction()
从outsideTransaction
没有创建新事务调用(因为拦截器仅绑定到 bean 边界) - 如果
outsideTransaction
将是第二个 bean 的一部分AnotherBean
,即@Inject
sMyBean
,并且您调用MyBean.withinTransaction
,则将创建一个新事务(如果尚不存在)。AnotherBean.outsideTransaction
因为您跨越和之间的bean 边界MyBean.withinTransaction
。
于 2017-02-10T15:44:00.750 回答