EJB3.1 - 同一 JVM 中多个应用程序的事务



我遇到以下情况:

  • App1 ear — 包含一些执行数据库工作的服务的应用程序。
  • App2 耳朵 — 另一个使用 App1 服务的应用程序。
  • 两者都在同一个 JVM 中运行。应用服务器是 JBoss7。
  • App2 在
  • 调用 App1 的服务之前/之后执行更多的数据库工作。

假设在 App2 的服务中有一个方法:

void method(){
   doDBWorkinApp2();
   callApp1ServiceToDoMoreDBWork();
   moreDBWorkinApp2();
}

我希望在单个事务中执行此方法。我该怎么做?

假设无状态,事务/持久性范围通常是传播的。但是,请考虑您用于每种方法的事务属性(即NOT_SUPPORTED,支持,强制...(和一些传播规则(规则:https://weblogs.java.net/blog/ss141213/archive/2006/10/persistence_con.html(。

如果

从事务中调用事务范围的实体管理器,则会创建一个新的持久性上下文(如果还没有与该事务关联的持久性上下文((Enterprise JavaBeans 3.0(

因此,如果您为两个无状态使用默认 Tx 属性(必需(:它们将共享相同的上下文,因此,如果 1 个方法失败,则所有方法都会回滚。如果您不想要这种行为,您仍然可以使用 (REQUIRES_NEW , NOT_SUPPORTED..(

要了解有关交易属性的更多信息:http://docs.oracle.com/javaee/6/api/javax/ejb/TransactionAttributeType.html

编辑:在多个 EAR 的情况下,每个 EJB 都有一个上下文(客户端上下文的类型(,并将根据调用的 EJB 的 TransactionAttribute 进行传播,这仅适用于本地调用。请注意,不能在远程 EJB 调用之间共享持久性上下文。

相关内容

最新更新