Jboss EAP 7 CDI JTA @Transactional

时间:2017-02-09 16:06:29

标签: java cdi jta java-ee-7 jboss-eap-7

我正在努力理解我应该如何处理在Jboss EAP 7实例上运行的JTA和CDI。我可以通过注入来自容器的UserTransaction对象手动获取事务,但是当我使用@Transactional注释方法时,我得到一个关于没有可用事务的异常....我的问题是。有没有配置丢失?我简单地读到,也许我应该自己创建一个拦截器以使其工作,但我还没有找到任何一致的例子......

1 个答案:

答案 0 :(得分:0)

在默认的JEE容器管理环境中,只有企业bean(通常使用@Stateless bean)才是事务性的。从外部输入这样的bean后,将打开该事务。使用@javax.transaction.Transactional注释,您可以控制事务的行为,但在默认情况下这不是必需的。

示例bean:

@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...");
   }
}
  • 如果您从Servlet中调用MyBean.withinTransaction(例如通过REST),则会创建一个新事务(如果尚未存在)。
  • 如果您致电MyBean.outsideTransaction,则不会创建任何交易。
  • 如果您从this.outsideTransaction()拨打withinTransaction,您仍然可以在outsideTransaction中使用该事务(因为拦截器只绑定到bean边界)
  • 如果从this.withinTransaction()调用outsideTransaction,则不会创建新事务(因为拦截器仅绑定到bean边界)
  • 如果outsideTransaction成为第二个bean AnotherBean的一部分,@Inject s MyBean,并且您致电MyBean.withinTransaction,那么新的交易将是创建(如果尚未存在)。因为您跨越了AnotherBean.outsideTransactionMyBean.withinTransaction之间的bean边界。