Nag*_*gyI 6 database spring transactions jta distributed-transactions
想象一个 Java 生态系统,其中三个独立的 Spring Web 应用程序在不同的 JVM 和不同的机器上运行(不涉及应用程序服务器,只是简单的 servlet 容器)。其中两个应用程序使用自己的数据库,通过 JPA 访问。现在第三个应用程序(协调器)向外界提供服务,一些服务功能执行远程操作,需要其他两个应用程序以事务的方式参与,这意味着如果其中一个应用程序无法在数据库,另一个也应该回滚。问题是:如何使用 Spring 实现这一点?
目前我们正在使用 REST 在应用程序之间进行通信。显然,这不能支持交易,即使有努力做到这一点。
我发现 JTA 能够组织全局事务。JTA 涉及创建参与全局管理事务的 XAResource 实例。如果我理解正确,这些 XAResource 实例可以驻留在单独的 JVM 上。资源的初始化、提交和回滚通过 JMS 通信发生,这意味着它需要消息代理在参与者之间传输消息。存在各种 JTA 实现,我发现 Atomikos 似乎是最常用的。
现在我没有看到的是,如果我在每个应用程序端都有一个 Spring 应用程序,这一切是如何发生的。我还没有找到任何通过网络进行 JTA 的示例项目。我也不明白 XAResources 代表什么。如果我使用 JPA,并说我在存储用户余额的应用程序中有一个 Account 对象,并且我必须减少协调器的余额,我是否应该创建一个允许减少余额的 XAResource 实现?或者 XAResource 是由较低级别的东西实现的,比如 JDBC 驱动程序或 Spring Data JPA?在后一种情况下,我如何为事务协调器提供高级别的 CRUD 操作。
XAResource 是一个较低级别的 API。您可以为协调员编写自己的内容,但我认为这是没有必要的。相反,在协调器上利用 JMS + JTA,在应用程序服务器上利用 JTA。
在正常情况下,你会得到这样的:
请注意,JTA 用于所有事务 - 这将是在所有服务器之间共享的全局 TX。如果这些步骤中的任何一个失败,那么它们将被回滚。
一旦你完成所有设置,Spring 应该能够使其透明。只需确保您的 DAO 和服务调用是事务性的。Atomikos 需要进行配置,以便每个服务器使用相同的 JTA tx 管理器。
| 归档时间: |
|
| 查看次数: |
1549 次 |
| 最近记录: |