我们有创建事务性操作的要求,但是需要通过多个应用程序进行处理。
我熟悉@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服务,其中参数之一是序列化的实体管理器,尽管这对我来说很奇怪。是否可以通过多个应用程序像共享事务一样填充操作?
答案 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的使用。 >