在 EJB 中使用 JTA 事务

如何在 Liberty 上的企业 JavaBeans (EJB) 中使用 JTA 事务。

关于此任务

EJB 是由 Liberty JVM 服务器管理的 Java™ 对象,允许 Java 应用程序的模块化体系结构。 Liberty JVM 服务器支持 EJB Lite 3.1 和 EJB Lite 3.2以及 EJB 3.2。 EJB 使用从 企业应用程序项目创建的企业应用程序归档 (EAR) 文件部署到 Liberty 服务器。 企业应用程序项目 可以同时包含 EJB 和 Web 项目。

通过将相关功能部件 ejbLite-3.1ejbLite-3.2 添加到 server.xml 配置文件来启用 EJB Lite。 通过将 ejb-3.2 添加到 server.xml 配置文件来启用 EJB。 EJB 将部署到容器中。 此容器在后台工作,确保遵守会话管理,事务和安全性等方面。

EJB 支持两种类型的事务管理: 容器管理和 Bean 管理。 容器管理的事务为对 Bean 方法的调用提供事务上下文,并使用 Java 注释或部署描述符文件 ejb-jar.xml进行定义。 Bean 管理的事务直接使用 Java 事务 API (JTA) 进行控制。 在这两种情况下, CICS ® 工作单元 (UOW) 仍是 JTA 事务结果的下级,假定您未使用 <cicsts_jta Integration="false"/> server.xml 元素禁用 CICS JTA 集成。

可以为容器管理的事务指定六个不同的事务属性:
  • 必需
  • 必需
  • RequiresNew
  • 支持
  • NotSupported
  • 从不

JTA 事务是 JEE 规范中定义的分布式 UOW。 设置方法的事务属性可确定执行该方法的 CICS 任务是在其自己的工作单元下运行,还是属于更广泛的分布式 JTA 事务。

注: 虽然 Liberty JTA 事务系统遵守此属性,但事务属性 NotSupported 未与 CICS UOW 集成,并且不受 CICS UOW 支持。 这通常适用于 EJB。

下表描述了所调用 EJB 方法的结果事务上下文,具体取决于事务属性以及调用应用程序是否已具有 JTA 事务上下文。

重要信息: Liberty 不支持出站或入站事务传播。 有关更多信息,请参阅 Using enterprise JavaBeans with remote interfaces on Liberty
表 1. EJB 事务支持
事务属性 无 JTA 事务 预先存在的 JTA 事务 使用预先存在的 JTA 事务访问远程 EJB 异常行为
必需 抛出异常 EJBTransactionRequiredException 继承现有 JTA 事务。 抛出异常 com.ibm.websphere.csi.CSITransactionMandatoryException 回滚
必需 EJB 容器创建新的 JTA 事务。 继承现有 JTA 事务。 抛出异常 com.ibm.websphere.csi.CSITransactionRequiredException 回滚
RequiresNew EJB 容器创建新的 JTA 事务。 抛出异常 javax.ejb.EJBException EJB 容器创建由远程服务器管理的新 JTA 事务。 回滚
支持 在没有 JTA 事务的情况下继续。 继承现有 JTA 事务。 抛出异常 com.ibm.websphere.csi.CSITransactionSupportedException 从 JTA 调用时回滚
NotSupported 在没有 JTA 事务的情况下继续。 暂挂 JTA 事务,但不暂挂 CICS UOW。 远程服务器在没有 JTA 事务的情况下继续运行。 无回滚
从不 在没有 JTA 事务的情况下继续。 抛出异常 javax.ejb.EJBException 远程服务器在没有 JTA 事务的情况下继续运行。 无回滚
重要信息: 调用标记为 NotSupported 的方法将暂挂 JTA 事务,但不会暂挂 CICS UOW。 在此方法调用期间对 CICS 资源的任何修改仍可恢复。
注: 如果启用了 JTA 集成,那么事务属性 RequiresNew 受 CICS Liberty JVM 服务器支持,并且存在无法嵌套 CICS UOW 的限制。 当 JTA 事务中已存在时,尝试调用标记为 RequiresNew 的方法将导致抛出异常。

如果从 servlet 或 POJO 调用 EJB ,并且未显式配置 EJB 事务属性,那么缺省情况下,容器管理的事务管理适用,缺省事务属性 Required也适用。 这意味着对 EJB 的每个调用都将启动一个具有下级 CICS UOW 的新 JTA 事务,并在每次调用后落实 JTA 事务。 如果不需要将 JTA 与 EJB 配合使用,请考虑使用事务属性 Never

有关其他 Enterprise JavaBeans (EJB) 功能部件限制的信息,请参阅 Liberty: 运行时环境已知问题和限制