【问题标题】:Sharing the transaction between multiple components在多个组件之间共享事务
【发布时间】:2019-03-17 15:07:02
【问题描述】:

我们正在开发一个包含许多独立组件(比如 A、B、C、D)的 java 程序。我们使用 Hibernate 框架进行数据库映射。其中一些在同一个 JVM 进程上工作,而其中一些在不同的 JVM 进程上工作。所有这些组件都有 REST 端点并有自己的实体映射文件。这些组件中的每一个都通过 TCP 相互通信。有一些业务逻辑需要其中一些组件协同工作。问题从这里开始。假设调用了组件 A。 A 启动一个新事务并更改数据库上的一些数据,然后调用组件 B。当组件 B 接受请求时,它会打开一个新事务并更改数据库上的一些信息并提交。完成工作后将结果返回给组件 A。组件 A 再次开始执行一些操作但失败并回滚所有更改它所做的更改并将响应返回到后面。但是组件 B 所做的更改仍然存在。这是我们程序的一个小例子。我们需要什么来处理这个问题的最佳方法是什么?

  1. 我们以某种方式在所有组件之间共享事务。因此,当组件收到请求时,首先检查该请求是否有任何活动事务。

  2. 第二种选择是对所有实体使用一个组件,而其他所有实体都使用它。当请求到来时,我们打开一个事务,所有组件都执行它们的工作,当我们返回响应时,我们检查是否没有任何异常我们提交否则回滚。

还有其他方法吗?或者在多组件架构系统之间使用事务的最佳实践是什么?使用单个组件将所有实体信息保存在一个点上的优点和缺点是什么?任何帖子、博客、文档、教程或书籍都是可以接受的。或者,如果可以,您可以分享您的实验。

【问题讨论】:

    标签: java hibernate transactions components transactionmanager


    【解决方案1】:

    您正在寻求实现“分布式事务”。

    如果您有 Java 应用程序,我推荐 Spring,因为它支持分布式事务: https://www.javaworld.com/article/2077963/open-source-tools/distributed-transactions-in-spring--with-and-without-xa.html

    【讨论】:

    • 感谢您的回复。但我们想在不使用 spring 的情况下做到这一点。
    • 您目前使用什么进行事务管理?分布式事务非常棘手,Spring 使用 Atomikos 或 Bitronix 嵌入式事务管理器,因此您可以尝试使用与 Spring 自己做的相同的事情。出于兴趣,为什么要避开春天?
    • 我们使用的是默认的(JTA)
    猜你喜欢
    • 2011-10-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-01-01
    • 2017-02-21
    • 1970-01-01
    • 2021-07-19
    • 2019-01-18
    相关资源
    最近更新 更多