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

时间:2018-08-22 19:58:35

标签: java spring spring-boot transactions

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

我熟悉@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作为参数,并使用不同方法填充多个操作。

但是,我们有一个奇怪的要求来实现类似于上面的代码,但是涉及共享同一数据库的多个应用程序,就像分布式事务一样。

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

1 个答案:

答案 0 :(得分:1)

您可能在XA Transactions上涉及JTA。您可以使用Spring support for JTA,这意味着在后台使用了特定的JTA Transaction Manager实现,例如Atomikos(付费)或Bitronix(Apache许可,现在有维护问题)。

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

Spring Boot + Atomikos sample on Github可以演示单个应用程序中JTA配置的基础。

一旦您熟悉了所有这些,就可能会遇到类似的问题as in this thread。请注意,后者是4年前提出的,自那时以来并没有发生太大变化,因此答案仍然很好。

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