Spring:如何处理跨服务的DB操作的事务



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

我有组织类,每个组织都会有一个相关的超级管理员。我正在创建一个组织,然后为它创建超级用户。但我想在事务中执行这些,即如果超级管理员创建失败,那么通过createOrganization((方法插入的组织行应该回滚。我正在使用JOOQ来处理DB操作。

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

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

您似乎希望将Spring的依赖项注入和(transactional?(数据源配置与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();
});

其思想是传递派生的Configuration对象,这些对象包含其事务状态。原始Configuration对象(在我的示例中为ctx1(不知道任何已启动的事务。

这与Spring建模线程绑定事务的方式大不相同,这些事务是根据您是否输入了@Transactional注释的方法来更新的,后者会更新线程上下文的全局事务状态。

由于您可能正在向所有服务注入包含ConfigurationDataSource的jOOQDSLContext,因此必须再次删除它,并传递您更喜欢使用的事务性DSLContext。这并非不可能,但它在"春天的世界"。每次你忘记这一点,你都会通过一个jOOQ事务,一个单独的Spring事务,以及这两件事彼此不知道来付出代价。

为什么不在任何地方都使用Spring的@Transactional注释呢?

相关内容

最新更新