Spring :如何处理跨服务的数据库操作事务

Spring :How to handle transactions for DB operations across services

我想了解如何在 Spring 中引入跨服务的事务。

我有一个组织 class,每个组织都会有一个关联的超级管理员。 我正在创建一个组织,然后为其创建超级用户。 但我想在事务中执行这些,即如果超级管理员创建失败,则应回滚通过 createOrganization() 方法插入的组织行。 我正在使用 JOOQ 来处理数据库操作。

如何实现跨服务(organizationService 和 userService)的事务?

addSuperAdmin(Organization organizationObject, SuperUser superUserObject)
{
    String orgId = organizationService.createOrganization(organizationObject);
    superUserObject.orgId = orgId;
    userService.AddSuperAdminDetailsToDB(superUserObject);
}

您似乎想将 Spring 的依赖注入和(事务性?)数据源配置与 jOOQ 的事务 API 混合。那是一条你可能会后悔很多次的路。

jOOQ 的交易API 是这样工作的:

// Some pre-configured DSLContext with a Configuration
ctx1.transaction(config2 -> {
    // A derived, transactional DSLContext with a derived Configuration
    config2.dsl().insertInto(...).execute();
});

这个想法是,您正在传递包含其事务状态的 derived Configuration 对象。 original Configuration 对象(在我的示例中为 ctx1)不知道任何已启动的事务。

这与 Spring 建模线程绑定事务的方式完全不同,线程绑定事务根据您是否正在输入 @Transactional 注释方法进行更新,后者会更新线程上下文的全局事务状态.

由于您可能正在向所有服务注入包含 ConfigurationDataSource 的 jOOQ DSLContext,因此您必须再次删除它,并传递事务 DSLContext 更喜欢 使用。这并非不可能,但它在“Spring 世界”中并不是惯用的。每次你忘记这一点,你都会付出代价,因为有一个 jOOQ 交易,一个单独的 Spring 交易,并且这两件事彼此不知道。

为什么不到处使用 Spring 的 @Transactional 注释呢?