我正在努力了解如何在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
注释的方法来更新的,后者会更新线程上下文的全局事务状态。
由于您可能正在向所有服务注入包含Configuration
和DataSource
的jOOQDSLContext
,因此必须再次删除它,并传递您更喜欢使用的事务性DSLContext
。这并非不可能,但它在"春天的世界"。每次你忘记这一点,你都会通过一个jOOQ事务,一个单独的Spring事务,以及这两件事彼此不知道来付出代价。
为什么不在任何地方都使用Spring的@Transactional
注释呢?