我们正在开发一个Java程序,该程序具有许多独立的组件(比如A,B,C,D)。我们使用Hibernate框架进行数据库映射。他们中的一些人在同一个JVM进程上工作,而另一些人在不同的JVM进程上工作。所有这些组件都具有REST端点,并且具有自己的实体映射文件。这些组件中的每个组件都通过TCP相互通信。有一些业务逻辑需要其中一些组件一起工作。问题从这里开始。假设组件A被调用。 A启动一个新事务并更改数据库上的某些数据,然后调用组件B。当组件B接受请求时,它将打开一个新事务并更改数据库上的某些信息并提交。完成其工作后,将结果返回到组件A。组件A再次开始执行一些操作,但失败了,并且回滚了所做的所有更改,并将响应返回给后面。但是组件B所做的更改仍然存在。这是我们程序的一个小例子。我们需要什么是解决此问题的最佳方法?
我们以某种方式在所有组件之间共享事务。因此,当组件首先获得请求时,请检查该请求是否有任何活动事务。
第二个选项是对所有实体使用一个组件,而其他所有实体都使用此组件。当请求到来时,我们打开一个事务,所有组件都在工作,当我们返回响应时,我们检查是否没有异常,否则进行回滚。
还有其他方法吗?还是在多组件体系结构系统之间使用事务的最佳实践是什么?使用单个组件将所有实体信息保持在同一点的优缺点是什么?任何帖子,博客,文档,教程或书籍都是可以接受的。或者,如果可以,您可以分享您的实验。
答案 0 :(得分:0)
您正在寻求实现“分布式事务”。
如果您有支持分布式事务的Java应用程序,我建议使用Spring: https://www.javaworld.com/article/2077963/open-source-tools/distributed-transactions-in-spring--with-and-without-xa.html