Java EE 5中的两阶段提交事务

时间:2011-08-23 00:48:34

标签: java jpa transactions ejb jta

我想知道如何使用Java EE5进行两阶段提交事务...我正在使用带JPA的EJB,其中hibernate配置了MySql。我只想使用JAVA EE规范来处理不使用hibernate或JDBC特定对象的事务....

1 个答案:

答案 0 :(得分:4)

要确保JTA事务用于执行JPA中的所有事务工作,您需要做的就是指定Persistence Unit类型是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实体管理器,而在Java SE环境中将创建RESOURCE_LOCAL实体管理器。

另请注意,如果您将transaction-type指定为RESOURCE_LOCAL,那么在Java EE环境中,JPA提供程序将忽略jta-data-source值,而是依赖于non-jta-data-source用于创建连接的{{1}}值。