使用 Quarkus 事务管理器管理 JTA 事务
前言 复制链接链接已复制到粘贴板!
作为应用程序开发人员,您可以使用 Quarkus 事务管理器协调并公开 JTA 事务到应用程序中。
Quarkus 提供了一个事务管理器,用于在一个或多个资源间协调 JTA 事务。您可以使用 Quarkus 事务管理器以声明性或编程的方式控制事务边界。您还可以修改事务并配置事务超时。此功能由 quarkus-narayana-jta 扩展提供。
对红帽文档提供反馈 复制链接链接已复制到粘贴板!
我们非常感谢您对我们的技术内容提供反馈,并鼓励您告诉我们您的想法。如果您想添加评论,提供见解、纠正拼写错误甚至询问问题,您可以在文档中直接这样做。
您必须有一个红帽帐户并登录到客户门户网站。
要从客户门户网站提交文档反馈,请执行以下操作:
- 选择 Multi-page HTML 格式。
- 点文档右上角的 反馈 按钮。
- 突出显示您要提供反馈的文本部分。
- 点高亮文本旁的添加反馈对话框。
- 在页面右侧的文本框中输入您的反馈,然后单击 Submit。
每次提交反馈时,我们都会自动创建跟踪问题。打开在点 Submit 后显示的链接,并开始监视问题或添加更多注释。
感谢您的宝贵反馈。
使开源包含更多 复制链接链接已复制到粘贴板!
红帽致力于替换我们的代码、文档和 Web 属性中存在问题的语言。我们从这四个术语开始:master、slave、黑名单和白名单。由于此项工作十分艰巨,这些更改将在即将推出的几个发行版本中逐步实施。有关更多详情,请参阅我们的首席技术官 Chris Wright 提供的消息。
第 1 章 先决条件 复制链接链接已复制到粘贴板!
已安装 OpenJDK (JDK) 11,并且
JAVA_HOME环境变量指定 Java SDK 的位置。- 登录到红帽客户门户网站,从 Software Downloads 页面下载 Red Hat Open JDK 版本。
已安装 Apache Maven 3.8.1 或更高版本。
具有 Quarkus Maven 项目。
- 有关如何使用 Maven 创建 Quarkus 应用程序的详情,请参考使用 Apache Maven 开发和编译 Quarkus 应用程序。
第 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)注解:
| 注解 | 描述 |
|---|---|
|
| 提供在方法级别或类级别控制任何 CDI Bean 上的事务边界的功能 |
|
| 提供指定标准 CDI 范围的功能,以定义其生命周期范围到当前活跃的事务的 bean 实例 |
您可以在 @Transactional 注释上设置属性,以控制事务如何启动。您可以对各个方法或整个 bean 应用带属性的 @Transactional 注释。
第 3 章 安装 Quarkus Narayana JTA 扩展 复制链接链接已复制到粘贴板!
您需要将 quarkus-narayana-jta 扩展作为依赖项添加到 Quarkus 项目。如果您使用 Hibernate ORM,则项目中已存在 quarkus-narayana-jta 扩展。
先决条件
- 具有 Quarkus Maven 项目。
流程
导航到项目的根目录。
cd <directory_name>
cd <directory_name>Copy to Clipboard Copied! Toggle word wrap Toggle overflow 使用以下方法之一将
quarkus-narayana-jta扩展添加到 Quarkus 项目中:将
quarkus-narayana-jta扩展添加到pom.xml文件中:<dependency> <groupId>io.quarkus</groupId> <artifactId>quarkus-narayana-jta</artifactId> </dependency><dependency> <groupId>io.quarkus</groupId> <artifactId>quarkus-narayana-jta</artifactId> </dependency>Copy to Clipboard Copied! Toggle word wrap Toggle overflow 使用命令行添加
quarkus-narayana-jta扩展:./mvnw quarkus:add-extension -Dextensions="narayana-jta"
./mvnw quarkus:add-extension -Dextensions="narayana-jta"Copy to Clipboard Copied! Toggle word wrap Toggle overflow
第 4 章 使用注解以声明性方式管理 JTA 事务 复制链接链接已复制到粘贴板!
您可以通过根据注解自动启动并提交 JTA 事务,让容器对事务进行抽样。以下章节演示了如何使用 @Transactional 注释来管理 JTA 事务和定义事务边界。
4.1. 以声明性方式定义事务边界 复制链接链接已复制到粘贴板!
您可以使用 @Transactional 来控制在方法级别或类级别的任何 CDI bean 上的事务边界,以确保每个方法都是事务的。这也适用于 REST 端点。
4.2. 声明性为回滚配置事务 复制链接链接已复制到粘贴板!
系统级别错误导致的例外,标记进行回滚的事务,并立即中止事务。您可以使用 @Transactional (dontRollbackOn=SomeException.class) 或 rollbackOn 属性来覆盖默认行为。
先决条件
- 具有 Quarkus Maven 项目。
流程
使用
@Transactional (dontRollbackOn=SomeException.class)指定不回滚事务的异常:src/main/java/org/acme/SantaClauseService.java 示例
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 在本例中,事务上下文被传播到
@Transactional方法中嵌套的所有调用(subDAO.addToGiftList ()和santaDAO.addToSantaTodoList ())。事务提交,除非运行时异常超过方法边界。
4.3. 声明性配置事务超时 复制链接链接已复制到粘贴板!
除了 @Transactional 注释外,使用 @TransactionConfiguration 注释来指定超时(以秒为单位)。您只能将 @TransactionConfiguration 注释放在对事务进行解码的顶级方法上。
流程
使用
@TransactionConfiguration的timeout属性来设置超时(以秒为单位):import javax.transaction.Transactional; @Transactional @TransactionConfiguration(timeout=40) public void getAGiftFromSanta(Child child, String giftDescription) {...}import javax.transaction.Transactional; @Transactional @TransactionConfiguration(timeout=40) public void getAGiftFromSanta(Child child, String giftDescription) {...}Copy to Clipboard Copied! Toggle word wrap Toggle overflow
方法中定义的配置优先于类中定义的配置。当您在类上定义 @TransactionConfiguration 时,它等同于在标记为 @Transactional 的类的所有方法上定义它。
4.4. 返回重新主动值的方法 复制链接链接已复制到粘贴板!
如果使用 @Transactional 注解的方法返回重新主动值,则它不会终止事务,直到返回的重新主动值被终止为止。当重新主动值以异常终止时,事务会被标记为回滚,否则会提交事务。
第 5 章 使用 API 方法以编程方式管理 JTA 事务 复制链接链接已复制到粘贴板!
您可以通过注入 用户交易 来以编程方式管理事务边界。以下章节演示了如何管理 JTA 事务并使用 API 方法定义事务界限。
5.1. 使用 API 方法定义事务边界 复制链接链接已复制到粘贴板!
您可以通过调用 begin ()、commit () 和 rollback () 方法来注入 用户事务 和管理事务边界。
流程
注入
用户事务接口:src/main/java/org/acme/SantaClauseService.java
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 使用事务分离方法控制事务:
src/main/java/org/acme/SantaClauseService.java
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 注意您不能在事务由
@Transactional调用开始的方法中使用UserTransactional。
5.2. 使用 API 方法为回滚配置事务 复制链接链接已复制到粘贴板!
系统级别错误导致的例外,标记进行回滚的事务。您可以通过注入 TransactionManager 来以编程方式标记事务。
流程
注入
TransactionManager并使用setRollbackOnly设置回滚的事务:在本例中,事务上下文被传播到
@Transactional方法中嵌套的所有调用(subDAO.addToGiftList ()和santaDAO.addToSantaTodoList ())。事务管理器提交事务,除非运行时异常超过方法边界。src/main/java/org/acme/SantaClausService.java 示例
Copy to Clipboard Copied! Toggle word wrap Toggle overflow
第 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>
quarkus.transaction-manager.default-transaction-timeout=<duration>Copy to Clipboard Copied! Toggle word wrap Toggle overflow 您可以设置 <
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>
quarkus.transaction-manager.node-name=<unique_id>Copy to Clipboard Copied! Toggle word wrap Toggle overflow 注意确保为每个事务管理器部署设置唯一的节点名称标识符。节点标识符必须在事务管理器重启时保持稳定。
第 8 章 Quarkus 事务配置属性概述 复制链接链接已复制到粘贴板!
下表列出了可用于配置事务管理的一些配置属性。
| 属性 | 描述 | Default(默认) |
|---|---|---|
|
|
允许您使用常规 JDBC 事务、XA 或禁用所有事务功能( | enabled |
|
|
事务隔离级别( | |
|
| 事务管理器管理的所有事务的超时时间 | 60 秒 |
|
| 节点名称标识符 |
更新于 2023-05-16