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


Red Hat build of Quarkus 2.2

指南

摘要

使用 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 软件包中定义的注解管理 JTA 事务,或通过上下文和依赖项注入(CDI)。

下表显示了最常用的 Java 事务 API(JTA)注解。.Java 事务 API(JTA)注解:

Expand
注解描述

@Transactional

能够在方法级别或类级别上控制任何 CDI Bean 的事务范围

@TransactionScoped

提供指定标准 CDI 范围的功能,以定义其生命周期范围仅限于当前活动的事务的实例

注意

您可以在 @Transactional 注释上设置属性来控制事务的启动方式。您可以将 @Transactional 注释与属性应用到单独的方法或整个 Bean。

第 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 事务,让容器分离事务界限。以下小节介绍了如何管理 JTA 事务并使用 @Transactional 注释定义事务边界。

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 方法(childDAO.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 将返回 reactive 值,它将不会终止事务,直到返回的 reactive 值被终止为止。当 reactive 值终止异常时,事务被标记为回滚,否则事务会被提交。

您可以通过注入 UserTransaction,以编程方式管理事务边界。以下小节介绍了如何管理 JTA 事务并使用 API 方法定义事务边界。

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

您可以注入 UserTransaction 并管理事务界限,方法是调用 start ()、 commit()rollback() 方法。

流程

  1. 注入 UserTransaction 接口:

    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

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

系统级故障导致的异常标记了回滚的事务。您可以通过注入 TransactionManager 来标记事务以以编程方式进行回滚。

流程

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

    在本例中,事务上下文被传播到嵌套在 @Transactional 方法(childDAO.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

    您可以以秒为单位设置 & lt;duration > 时间,或使用标准 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 事务配置属性及其默认值:
属性描述默认

quarkus.datasource.jdbc.transactions

可让您使用常规 JDBC 事务、AIX 或禁用所有事务功能(启用xa禁用

enabled

quarkus.datasource.jdbc.transaction-isolation-level

事务隔离级别(未定义、no、read-committedread-committedread-committed、可重复 读取、序列化

 

quarkus.transaction-manager.default-transaction-timeout

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

60 秒

quarkus.transaction-manager.node-name

节点名称标识符

 

修订于 2023-01-28 19:58:58 +1000

Red Hat logoGithubredditYoutubeTwitter

学习

尝试、购买和销售

社区

关于红帽文档

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

让开源更具包容性

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

關於紅帽

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

Theme

© 2026 Red Hat
返回顶部