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

标签 java jpa transactions ejb jta

我想知道如何使用 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/

相关文章:

java - javax.media.jai 类(class)的公共(public)下载?

java - XSSFWorkbook 需要很长时间才能加载 excel (.xlsx) 文件

java - hibernate 与 EclipseLink

hibernate - 如何更改 JPA 中的实体类型?

java - CAS 服务器 4.0.x reSTLet api 提供的凭据为空

spring - 带有 Java util.Date 的 Postgres 时间戳列

使用相关实体的主键过滤结果的 Hibernate 条件查询

Mysql:连接表在插入时是否被锁定?

java - Spring @Transactional 属性是否适用于私有(private)方法?

java - root=这样带值的url,带key不带值的参数如何处理?