我想知道如何使用 Java EE5 进行两阶段提交事务...我正在使用 EJB 和 JPA,其中 JPA 已配置了 MySql 的 hibernate。我只想使用 JAVA EE 规范进行事务处理,而不使用 hibernate 或 JDBC 特定对象....
最佳答案
为了确保使用 JTA 事务来执行 JPA 中的所有事务性工作,您所需要做的就是指定持久性单元类型为 JTA,并指定 JTA 数据源以供 JPA 提供程序使用。您的 persistence.xml 文件将包含类似于以下内容的内容:
<persistence version="1.0" xmlns="http://java.sun.com/xml/ns/persistence" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_1_0.xsd">
<!-- Specifies the type of the entity managers used by the persistence unit,
as a JTA entity manager -->
<persistence-unit name="example-pu" transaction-type="JTA">
<provider>org.hibernate.ejb.HibernatePersistence</provider>
<!-- Specifies a JTA datasource for use by the JPA provider.
All connections obtained by the JPA provider for this persistence unit
will be from this datasource -->
<jta-data-source>jdbc/myDS</jta-data-source>
...
</persistence-unit>
</persistence>
此外,您必须确保 jta-data-source 属性中定义的数据源不采用允许本地事务等优化。简单来说,涉及该数据源的所有事务都必须是XA事务,或者数据源必须是不支持本地事务的XA数据源。
请注意,仅指定 JTA 数据源是不够的。您必须将持久性单元定义为需要使用 JTA 实体管理器的持久性单元,因为 transaction-type
属性的未定义值取决于 JPA 提供程序运行的环境。如果提供程序在 Java EE 环境中运行,则将创建 JTA
实体管理器,而 RESOURCE_LOCAL
实体管理器将在 Java SE 环境中创建。
另请注意,如果您将 transaction-type
指定为 RESOURCE_LOCAL
,那么在 Java EE 环境中,JPA 提供程序将忽略 jta- data-source
值,并将依赖 non-jta-data-source
值来创建连接。
关于java - Java EE 5 中的两阶段提交事务,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7155208/