Java 多个应用程序之间的共享事务

Java 多个应用程序之间的共享事务,java,spring,spring-boot,transactions,Java,Spring,Spring Boot,Transactions,我们需要创建一个事务性操作,但需要通过多个应用程序进行处理 我熟悉使用@Transactional注释来实现事务,或者以编程方式使用它,例如: @Autowired private EntityManagerFactory emf; public void doSomething() { EntityManager em = emf.createEntityManager(); EntityTransaction tx = em.getTransaction(); tx

我们需要创建一个事务性操作,但需要通过多个应用程序进行处理

我熟悉使用
@Transactional
注释来实现事务,或者以编程方式使用它,例如:

@Autowired
private EntityManagerFactory emf;

public void doSomething() {
    EntityManager em = emf.createEntityManager();
    EntityTransaction tx = em.getTransaction();
    tx.begin();
    em.createNativeQuery("...do something...").executeUpdate();
    tx.commit();
    em.close();
}
因此,如果我需要允许应用程序动态创建事务,我可以将
em
作为参数传递,并从不同的方法填充多个操作

然而,我们有一个奇怪的需求,需要实现类似于上述代码的内容,但涉及多个共享同一数据库的应用程序,这就像一个分布式事务

这对春天可行吗?我不确定是否可以创建一些rest服务,其中一个参数是序列化实体管理器,尽管这在我看来很奇怪。是否可以像处理共享事务一样通过多个应用程序填充操作?

您可能会涉及多个应用程序。您可以使用它,这意味着在后台使用特定的JTA事务管理器实现,例如(付费)或(Apache许可,立即维护问题)

还提供了一些很好的概述,特别是描述了XA的替代方案,包括对最终一致性的描述

Spring Boot+Atomikos可以在单个应用程序中演示JTA配置的基础知识

一旦你熟悉了所有这些,你可能会有类似的问题。请注意,后者是在4年前提出的,自那时以来没有什么大的变化,所以答案仍然是好的


一般来说,跨多个应用程序/服务开发和实施分布式ACID事务可能是一个非常具有挑战性的史诗,通常可以通过重新设计整个解决方案来避免XA使用。

您不能序列化实体管理器(当然也不能通过网络发送). 您必须使用XA事务/2分阶段提交。非常有趣,这就是我要找的。谢谢