在 Cloud Foundry 环境的 Liberty 构建包中禁用了两阶段落实 (XA) 事务。 缺省情况下,Liberty 事务管理器会将事务日志文件写到本地文件系统。 因为本地文件系统是云平台中的临时文件系统,所以在应用程序或 Java 虚拟机崩溃之后,事务日志文件将不可用。 虽然此事务管理器可配置为使用数据库服务来存储事务日志,但云平台将在崩溃后自动创建应用程序的全新实例。 因此,此事务管理器无法确定要使用哪个特定日志来恢复已失败实例的事务。
可以通过 EJB Bean 或应用程序使用javax.transaction.UserTransaction 类来使用两阶段落实事务。 要在 Cloud Foundry 环境中成功运行,请验证应用程序是否需要 XA 事务。
缺省情况下,Enterprise JavaBeans (EJB) bean 是用容器进行管理的而且具有必需的事务属性,这意味着它们使用 JTA 事务。 完全支持跨单个资源的 JTA 事务。 跨多个资源的 JTA 事务需要两阶段落实,这在 Cloud Foundry 环境中不受支持。
在 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>