在 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.1 或 ejbLite-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 事务。
NotSupported 未与 CICS UOW 集成,并且不受 CICS UOW 支持。 这通常适用于 EJB。下表描述了所调用 EJB 方法的结果事务上下文,具体取决于事务属性以及调用应用程序是否已具有 JTA 事务上下文。
| 事务属性 | 无 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 资源的任何修改仍可恢复。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: 运行时环境已知问题和限制。