gpt4 book ai didi

database - 跨 Spring Web 应用程序的分布式事务

转载 作者:太空狗 更新时间:2023-10-30 01:57:45 24 4
gpt4 key购买 nike

想象一个 Java 生态系统,其中三个独立的 Spring Web 应用程序在不同的 JVM 和不同的机器上运行(不涉及应用程序服务器,只是简单的 servlet 容器)。其中两个应用程序使用它们自己的数据库,通过 JPA 访问。现在第三个应用程序(一个协调器)对外提供服务,一些服务功能执行远程操作,这需要其他两个应用程序以事务的方式参与,这意味着如果其中一个应用程序无法在数据库,另一个也应该回滚。问题是:如何使用 Spring 实现这一点?

目前我们正在使用 REST 在应用程序之间进行通信。显然这不能支持交易,即使there are efforts to make this happen .

我找到了能够组织全局事务的 JTA。 JTA 涉及创建参与全局管理事务的 XAResource 实例。如果我理解正确,这些 XAResource 实例可以驻留在单独的 JVM 上。资源的初始化、提交和回滚通过 JMS 通信进行,这意味着它需要消息代理在参与者之间传输消息。存在各种 JTA 实现,我发现 Atomikos 似乎是最常用的。

现在我看不到的是,如果我在每个应用程序端都有一个 Spring 应用程序,这一切是如何发生的。我还没有找到任何通过网络执行 JTA 的示例项目。我也不明白 XAResources 代表什么。如果我使用 JPA,并说我在存储用户余额的应用程序中有一个帐户对象,并且我必须减少协调器的余额,我是否应该创建一个允许减少余额的 XAResource 实现?或者 XAResource 是由 JDBC 驱动程序或 Spring Data JPA 等较低级别的东西实现的?在后一种情况下,我如何为事务协调器提供高级 CRUD 操作。

最佳答案

XAResource 是较低级别的 API。你可以为协调员写你自己的,但我认为这不是必需的。相反,在协调器上利用 JMS + JTA,在应用服务器上利用 JTA。

在正常情况下,你会有这样的:

  1. 协调器接收到请求并启动 JTA 事务
  2. 协调器通过 JMS 调用应用程序 1
    • App 1 接收 JMS 消息
    • App 1 使用 JTA 调用 DB 1
  3. 协调器通过 JMS 调用应用程序 2
    • 应用 2 接收 JVM 消息
    • App 2 使用 JTA 调用 DB 2
  4. 协调员提交 tx

请注意,JTA 用于所有事务 - 这将是在所有服务器之间共享的全局 TX。如果这些步骤中的任何一个失败,它们将被回滚。

一旦您完成所有设置,Spring 应该能够使它变得透明。只需确保您的 DAO 和服务调用是事务性的。需要配置 Atomikos,以便每个服务器使用相同的 JTA tx 管理器。

关于database - 跨 Spring Web 应用程序的分布式事务,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24937002/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com