使用 Quarkus 事务管理器管理 JTA 事务


Red Hat build of Quarkus 1.11

摘要

使用 Narayana JTA 扩展来管理 Quarkus 应用程序中的事务。

前言

作为应用程序开发人员,您可以使用 Quarkus 事务管理器协调并公开 JTA 事务到应用程序中。

Quarkus 提供了一个事务管理器,用于在一个或多个资源间协调 JTA 事务。您可以使用 Quarkus 事务管理器以声明性或编程的方式控制事务边界。您还可以修改事务并配置事务超时。此功能由 quarkus-narayana-jta 扩展提供。

对红帽文档提供反馈

我们非常感谢您对我们的技术内容提供反馈,并鼓励您告诉我们您的想法。如果您想添加评论,提供见解、纠正拼写错误甚至询问问题,您可以在文档中直接这样做。

注意

您必须有一个红帽帐户并登录到客户门户网站。

要从客户门户网站提交文档反馈,请执行以下操作:

  1. 选择 Multi-page HTML 格式。
  2. 点文档右上角的 反馈 按钮。
  3. 突出显示您要提供反馈的文本部分。
  4. 点高亮文本旁的添加反馈对话框。
  5. 在页面右侧的文本框中输入您的反馈,然后单击 Submit

每次提交反馈时,我们都会自动创建跟踪问题。打开在点 Submit 后显示的链接,并开始监视问题或添加更多注释。

感谢您的宝贵反馈。

使开源包含更多

红帽致力于替换我们的代码、文档和 Web 属性中存在问题的语言。我们从这四个术语开始:master、slave、黑名单和白名单。由于此项工作十分艰巨,这些更改将在即将推出的几个发行版本中逐步实施。有关更多详情,请参阅我们的首席技术官 Chris Wright 提供的消息

第 1 章 先决条件

第 2 章 Narayana JTA 事务管理器和 Quarkus

Narayana JTA 事务管理器可让您协调并公开 JTA 事务到 Quarkus 应用程序。您可以将 quarkus-narayana-jta 扩展作为项目的 pom.xml 文件的依赖项,并通过 javax.transaction 软件包中定义的注解或上下文和依赖项注入(CDI)管理 JTA 事务。

下表显示了最常见的 Java Transaction API (JTA)注解。Java Transaction API (JTA)注解:

Expand
注解描述

@Transactional

提供在方法级别或类级别控制任何 CDI Bean 上的事务边界的功能

@TransactionScoped

提供指定标准 CDI 范围的功能,以定义其生命周期范围到当前活跃的事务的 bean 实例

注意

您可以在 @Transactional 注释上设置属性,以控制事务如何启动。您可以对各个方法或整个 bean 应用带属性的 @Transactional 注释。

第 3 章 安装 Quarkus Narayana JTA 扩展

您需要将 quarkus-narayana-jta 扩展作为依赖项添加到 Quarkus 项目。如果您使用 Hibernate ORM,则项目中已存在 quarkus-narayana-jta 扩展。

先决条件

  • 具有 Quarkus Maven 项目。

流程

  1. 导航到项目的根目录。

    cd <directory_name>
    Copy to Clipboard Toggle word wrap
  2. 使用以下方法之一将 quarkus-narayana-jta 扩展添加到 Quarkus 项目中:

    1. quarkus-narayana-jta 扩展添加到 pom.xml 文件中:

      <dependency>
          <groupId>io.quarkus</groupId>
          <artifactId>quarkus-narayana-jta</artifactId>
      </dependency>
      Copy to Clipboard Toggle word wrap
    2. 使用命令行添加 quarkus-narayana-jta 扩展:

      ./mvnw quarkus:add-extension -Dextensions="narayana-jta"
      Copy to Clipboard Toggle word wrap

第 4 章 使用注解以声明性方式管理 JTA 事务

您可以通过根据注解自动启动并提交 JTA 事务,让容器对事务进行抽样。以下章节演示了如何使用 @Transactional 注释来管理 JTA 事务和定义事务边界。

4.1. 以声明性方式定义事务边界

您可以使用 @Transactional 来控制在方法级别或类级别的任何 CDI bean 上的事务边界,以确保每个方法都是事务的。这也适用于 REST 端点。

流程

  • 使用条目方法上的 @Transactional 注释定义事务范围:

    src/main/java/org/acme/SantaClauseService.java 示例

    import javax.inject.Inject;
    import javax.enterprise.context.ApplicationScoped;
    import javax.transaction.Transactional;
    
    @ApplicationScoped
    public class SantaClausService {
    
        @Inject ChildDAO childDAO;
        @Inject SantaClausDAO santaDAO;
    
        @Transactional 
    1
    
        public void getAGiftFromSanta(Child child, String giftDescription) {
            // some transaction work
            Gift gift = childDAO.addToGiftList(child, giftDescription);
            if (gift == null) {
                throw new OMGGiftNotRecognizedException(); 
    2
    
            }
            else {
                santaDAO.addToSantaTodoList(gift);
            }
        }
    }
    Copy to Clipboard Toggle word wrap

    1
    @transactional 注释定义您的事务边界,并将此调用嵌套在事务中。
    2
    RuntimeException 跨事务边界时,事务管理器会回滚事务。

4.2. 声明性为回滚配置事务

系统级别错误导致的例外,标记进行回滚的事务,并立即中止事务。您可以使用 @Transactional (dontRollbackOn=SomeException.class)rollbackOn 属性来覆盖默认行为。

先决条件

  • 具有 Quarkus Maven 项目。

流程

  • 使用 @Transactional (dontRollbackOn=SomeException.class) 指定不回滚事务的异常:

    src/main/java/org/acme/SantaClauseService.java 示例

    import javax.inject.Inject;
    import javax.enterprise.context.ApplicationScoped;
    import javax.transaction.Transactional;
    
    @ApplicationScoped
    public class SantaClausService {
    
        @Inject ChildDAO childDAO;
        @Inject SantaClausDAO santaDAO;
    
        @Transactional(dontRollbackOn=NonCriticalRuntimeException.class)
        public void getAGiftFromSanta(Child child, String giftDescription) throws Exception {
            Gift gift = childDAO.addToGiftList(child);
    
            // might throw a NonCriticalRuntimeException
            gift.setDescription(giftDescription);
    
            santaDAO.addToSantaTodoList(gift);
        }
    }
    Copy to Clipboard Toggle word wrap

    在本例中,事务上下文被传播到 @Transactional 方法中嵌套的所有调用(subDAO.addToGiftList ()santaDAO.addToSantaTodoList ())。事务提交,除非运行时异常超过方法边界。

4.3. 声明性配置事务超时

除了 @Transactional 注释外,使用 @TransactionConfiguration 注释来指定超时(以秒为单位)。您只能将 @TransactionConfiguration 注释放在对事务进行解码的顶级方法上。

流程

  • 使用 @TransactionConfigurationtimeout 属性来设置超时(以秒为单位):

    import javax.transaction.Transactional;
    
    @Transactional
    @TransactionConfiguration(timeout=40)
    public void getAGiftFromSanta(Child child, String giftDescription) {...}
    Copy to Clipboard Toggle word wrap
注意

方法中定义的配置优先于类中定义的配置。当您在类上定义 @TransactionConfiguration 时,它等同于在标记为 @Transactional 的类的所有方法上定义它。

4.4. 返回重新主动值的方法

如果使用 @Transactional 注解的方法返回重新主动值,则它不会终止事务,直到返回的重新主动值被终止为止。当重新主动值以异常终止时,事务会被标记为回滚,否则会提交事务。

您可以通过注入 用户交易 来以编程方式管理事务边界。以下章节演示了如何管理 JTA 事务并使用 API 方法定义事务界限。

5.1. 使用 API 方法定义事务边界

您可以通过调用 begin ()commit ()rollback () 方法来注入 用户事务 和管理事务边界。

流程

  1. 注入 用户事务 接口:

    src/main/java/org/acme/SantaClauseService.java

    @ApplicationScoped
    public class SantaClausService {
    
        @Inject ChildDAO childDAO;
        @Inject SantaClausDAO santaDAO;
        @Inject UserTransaction transaction;
    }
    Copy to Clipboard Toggle word wrap

  2. 使用事务分离方法控制事务:

    src/main/java/org/acme/SantaClauseService.java

    import javax.transaction.Transactional;
    import javax.inject.Inject;
    import javax.transaction.SystemException;
    import javax.transaction.UserTransaction;
    
    @ApplicationScoped
    public class SantaClausService {
    
        @Inject ChildDAO childDAO;
        @Inject SantaClausDAO santaDAO;
        @Inject UserTransaction transaction;
    
        public void getAGiftFromSanta(Child child, String giftDescription) {
            // some transaction work
            try {
                transaction.begin(); 
    1
    
                Gift gift = childDAO.addToGiftList(child, giftDescription);
                santaDAO.addToSantaTodoList(gift);
                transaction.commit();
            }
            catch(SomeException e) {
                // do something on Tx failure
                transaction.rollback(); 
    2
    
            }
        }
    }
    Copy to Clipboard Toggle word wrap

    1
    将您的事务代码放在 transaction.begin ()transaction.commit () 之间。
    2
    立即中止事务。
    注意

    您不能在事务由 @Transactional 调用开始的方法中使用 UserTransaction al。

5.2. 使用 API 方法为回滚配置事务

系统级别错误导致的例外,标记进行回滚的事务。您可以通过注入 TransactionManager 来以编程方式标记事务。

流程

  1. 注入 TransactionManager 并使用 setRollbackOnly 设置回滚的事务:

    在本例中,事务上下文被传播到 @Transactional 方法中嵌套的所有调用(subDAO.addToGiftList ()santaDAO.addToSantaTodoList ())。事务管理器提交事务,除非运行时异常超过方法边界。

    src/main/java/org/acme/SantaClausService.java 示例

    import javax.transaction.Transactional;
    import javax.inject.Inject;
    import javax.transaction.SystemException;
    import javax.transaction.UserTransaction;
    
    @ApplicationScoped
    public class SantaClausService {
    
        @Inject TransactionManager tm; 
    1
    
        @Inject ChildDAO childDAO;
        @Inject SantaClausDAO santaDAO;
    
        @Transactional
        public void getAGiftFromSanta(Child child, String giftDescription) {
            // some transaction work
            Gift gift = childDAO.addToGiftList(child, giftDescription);
            if (gift == null) {
                tm.setRollbackOnly(); 
    2
    
            }
            else {
                santaDAO.addToSantaTodoList(gift);
            }
        }
    }
    Copy to Clipboard Toggle word wrap

    1
    注入 TransactionManager,以激活 setRollbackOnly 语义。
    2
    以编程方式决定何时回滚事务。

第 6 章 覆盖默认事务超时

您可以通过在 application.properties 文件中设置 quarkus.transaction-manager.default-transaction-timeout 属性的值来覆盖事务超时。由事务管理器管理的所有事务的默认超时时间为 60 秒。如果没有在超时内解析事务,事务管理器会自动回滚。

流程

  • application.properties 文件中的 quarkus.transaction-manager.default-transaction-timeout 属性设置 < duration >:

    quarkus.transaction-manager.default-transaction-timeout=<duration>
    Copy to Clipboard Toggle word wrap

    您可以设置 < duration&gt; 时间(以秒为单位),或使用标准 java.time.Duration 格式。例如,要将超时设置为 2 分钟,请输入 quarkus.transaction-manager.default-transaction-timeout=PT2M

第 7 章 为 XA 事务配置事务节点名称标识符

您可以为具有多个资源的 XA 事务设置唯一节点标识符。当您创建事务时,节点名称标识符将变为事务 ID 的一部分。标识符允许事务管理器识别数据库或 JMS 代理中创建的 XA 事务的对应部分。事务管理器可以在恢复过程中回滚事务的对应部分。

流程

  • application.properties 文件中为 quarkus.transaction-manager.node-name 属性设置一个值:

    quarkus.transaction-manager.node-name=<unique_id>
    Copy to Clipboard Toggle word wrap
    注意

    确保为每个事务管理器部署设置唯一的节点名称标识符。节点标识符必须在事务管理器重启时保持稳定。

第 8 章 Quarkus 事务配置属性概述

下表列出了可用于配置事务管理的一些配置属性。

Expand
表 8.1. 表 Quarkus 事务配置属性及其默认值:
属性描述Default(默认)

quarkus.datasource.jdbc.transactions

允许您使用常规 JDBC 事务、XA 或禁用所有事务功能(启用xa禁用)

enabled

quarkus.datasource.jdbc.transaction-isolation-level

事务隔离级别(未定义的noneread-uncommittedread-committed可重复读取serializable)

 

quarkus.transaction-manager.default-transaction-timeout

事务管理器管理的所有事务的超时时间

60 秒

quarkus.transaction-manager.node-name

节点名称标识符

 

更新于 2023-05-16

法律通告

Copyright © 2023 Red Hat, Inc.
The text of and illustrations in this document are licensed by Red Hat under a Creative Commons Attribution–Share Alike 3.0 Unported license ("CC-BY-SA"). An explanation of CC-BY-SA is available at http://creativecommons.org/licenses/by-sa/3.0/. In accordance with CC-BY-SA, if you distribute this document or an adaptation of it, you must provide the URL for the original version.
Red Hat, as the licensor of this document, waives the right to enforce, and agrees not to assert, Section 4d of CC-BY-SA to the fullest extent permitted by applicable law.
Red Hat, Red Hat Enterprise Linux, the Shadowman logo, the Red Hat logo, JBoss, OpenShift, Fedora, the Infinity logo, and RHCE are trademarks of Red Hat, Inc., registered in the United States and other countries.
Linux® is the registered trademark of Linus Torvalds in the United States and other countries.
Java® is a registered trademark of Oracle and/or its affiliates.
XFS® is a trademark of Silicon Graphics International Corp. or its subsidiaries in the United States and/or other countries.
MySQL® is a registered trademark of MySQL AB in the United States, the European Union and other countries.
Node.js® is an official trademark of Joyent. Red Hat is not formally related to or endorsed by the official Joyent Node.js open source or commercial project.
The OpenStack® Word Mark and OpenStack logo are either registered trademarks/service marks or trademarks/service marks of the OpenStack Foundation, in the United States and other countries and are used with the OpenStack Foundation's permission. We are not affiliated with, endorsed or sponsored by the OpenStack Foundation, or the OpenStack community.
All other trademarks are the property of their respective owners.
Red Hat logoGithubredditYoutubeTwitter

学习

尝试、购买和销售

社区

关于红帽文档

通过我们的产品和服务,以及可以信赖的内容,帮助红帽用户创新并实现他们的目标。 了解我们当前的更新.

让开源更具包容性

红帽致力于替换我们的代码、文档和 Web 属性中存在问题的语言。欲了解更多详情,请参阅红帽博客.

關於紅帽

我们提供强化的解决方案,使企业能够更轻松地跨平台和环境(从核心数据中心到网络边缘)工作。

Theme

© 2026 Red Hat
返回顶部