在云平台上,在 Liberty 中未启用两阶段落实 (XA) 事务。 缺省情况下,Liberty 事务管理器会将事务日志文件写到本地文件系统。 因为本地文件系统是云平台中的临时文件系统,所以在应用程序或 Java 虚拟机崩溃之后,事务日志文件将不可用。 虽然此事务管理器可配置为使用数据库服务来存储事务日志,但云平台将在崩溃后自动创建应用程序的全新实例。 因此,此事务管理器无法确定要使用哪个特定日志来恢复已失败实例的事务。
缺省情况下,Enterprise JavaBeans (EJB) bean 是用容器进行管理的而且具有必需的事务属性,这意味着它们使用 JTA 事务。 完全支持跨单个资源的 JTA 事务。 跨多个资源的 JTA 事务需要两阶段落实,但不支持两阶段落实。 此规则将标记引用了 javax.ejb 包的 ejb-jar.xml 文件和 Java 代码。
此规则还会标记具有对以下内容的引用的 Java 代码:javax.transaction。UserTransaction 类。
检查应用程序是否使用 XA 事务,如果有 XA 事务则将它们移除。
在 Java 代码中,以下显式注释表明使用了 JTA 事务:
javax.ejb.TransactionAttribute(javax.ejb.TransactionAttributeType.MANDATORY)javax.ejb.TransactionAttribute(javax.ejb.TransactionAttributeType.REQUIRED)javax.ejb.TransactionAttribute(javax.ejb.TransactionAttributeType.REQUIRES_NEW)javax.ejb.TransactionAttribute(javax.ejb.TransactionAttributeType.SUPPORTS)javax.ejb.TransactionManagement(javax.ejb.TransactionManagementType.CONTAINER)在 ejb-jar.xml 文件中,以下显式元素表明使用了 JTA 事务:
<trans-attribute>Mandatory|Required|RequiresNew|Supports</trans-attribute><transaction-type>Container</transaction-type>注意:如果您的应用程序不使用 javax.transaction。UserTransaction 类,并且所有应用程序 EJB Bean 都是 Bean 管理的,或者容器管理的事务属性
为“Never”或“NotSupported”,那么您的应用程序不使用 XA 事务,并且可以忽略此
规则的标记。
以下显式注释或元素表明 EJB bean 未使用 XA 事务:
javax.ejb.TransactionAttribute(javax.ejb.TransactionAttributeType.NEVER)javax.ejb.TransactionAttribute(javax.ejb.TransactionAttributeType.NOT_SUPPORTED)javax.ejb.TransactionManagement(javax.ejb.TransactionManagementType.BEAN)<trans-attribute>Never|NotSupported</trans-attribute><transaction-type>Bean</transaction-type>