2

我有以下情况:

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

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

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

我希望此方法在单个事务中执行。我怎样才能做到这一点?

4

1 回答 1

4

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

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

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

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

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

于 2013-10-11T04:21:45.540 回答