使用 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 页面下载 Open JDK 的 Red Hat build。
已安装 Apache Maven 3.6.2 或更高版本。
- 从 Apache Maven Project 网站下载 Maven。
具有 Quarkus Maven 项目。
- 如需有关如何使用 Maven 创建 Quarkus 应用程序的信息,请参阅使用 Apache Maven 开发和编译 Quarkus 应用程序。
第 2 章 Narayana JTA 事务管理器和 Quarkus 复制链接链接已复制到粘贴板!
Narayana JTA 事务管理器可让您协调并公开 JTA 事务到您的 Quarkus 应用程序。您可以将 quarkus-narayana-jta 扩展作为依赖项包含在项目的 pom.xml 文件中,并通过在 javax.transaction 软件包中定义的注解管理 JTA 事务,或通过上下文和依赖项注入(CDI)。
下表显示了最常用的 Java 事务 API(JTA)注解。.Java 事务 API(JTA)注解:
| 注解 | 描述 |
|---|---|
|
| 能够在方法级别或类级别上控制任何 CDI Bean 的事务范围 |
|
| 提供指定标准 CDI 范围的功能,以定义其生命周期范围仅限于当前活动的事务的实例 |
您可以在 @Transactional 注释上设置属性来控制事务的启动方式。您可以将 @Transactional 注释与属性应用到单独的方法或整个 Bean。
第 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 事务,让容器分离事务界限。以下小节介绍了如何管理 JTA 事务并使用 @Transactional 注释定义事务边界。
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方法(childDAO.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 将返回 reactive 值,它将不会终止事务,直到返回的 reactive 值被终止为止。当 reactive 值终止异常时,事务被标记为回滚,否则事务会被提交。
第 5 章 使用 API 方法以编程方式管理 JTA 事务 复制链接链接已复制到粘贴板!
您可以通过注入 UserTransaction,以编程方式管理事务边界。以下小节介绍了如何管理 JTA 事务并使用 API 方法定义事务边界。
5.1. 使用 API 方法定义事务界限 复制链接链接已复制到粘贴板!
您可以注入 UserTransaction 并管理事务界限,方法是调用 start ()、 commit() 和 rollback() 方法。
流程
注入
UserTransaction接口: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调用方式使用UserTransaction。
5.2. 使用 API 方法配置事务进行回滚 复制链接链接已复制到粘贴板!
系统级故障导致的异常标记了回滚的事务。您可以通过注入 TransactionManager 来标记事务以以编程方式进行回滚。
流程
注入
TransactionManager,并使用setRollbackOnly为回滚设置事务:在本例中,事务上下文被传播到嵌套在
@Transactional方法(childDAO.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 您可以以秒为单位设置 &
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>
quarkus.transaction-manager.node-name=<unique_id>Copy to Clipboard Copied! Toggle word wrap Toggle overflow 注意确保为每个部署事务管理器设置唯一节点名称标识符。在事务管理器重启时,节点标识符必须稳定。
第 8 章 Quarkus 事务配置属性概述 复制链接链接已复制到粘贴板!
下表列出了可用于配置事务管理的一些配置属性。
| 属性 | 描述 | 默认 |
|---|---|---|
|
|
可让您使用常规 JDBC 事务、AIX 或禁用所有事务功能( | enabled |
|
|
事务隔离级别( | |
|
| 由事务管理器管理的所有事务的超时 | 60 秒 |
|
| 节点名称标识符 |
修订于 2023-01-28 19:58:58 +1000