gpt4 book ai didi

spring-boot - Spring :How to handle transactions for DB operations across services

转载 作者:行者123 更新时间:2023-12-04 07:22:50 26 4
gpt4 key购买 nike

我试图了解如何在 Spring 中跨服务引入事务。
我有组织类,每个组织都会有一个关联的 super 管理员。
我正在创建一个组织,然后为它创建 super 用户。
但是我想在事务中执行这些,即如果 super 管理员创建失败,那么应该回滚由 createOrganization() 方法插入的组织行。
我正在使用 JOOQ 来处理数据库操作。
如何实现跨服务(organizationService 和 userService)的事务?

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

最佳答案

您似乎想将 Spring 的依赖注入(inject)和(事务?)数据源的配置与 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 更新的线程绑定(bind)事务建模的方式完全不同。带注释的方法,用于更新线程上下文的全局事务状态。
由于您可能正在注入(inject) jOOQ DSLContext包含 ConfigurationDataSource对于您的所有服务,您必须再次删除它,并传递事务性 DSLContext您更喜欢使用它。这并非不可能,但在“ Spring 的世界”中却不是惯用的。每次你忘记这一点,你都会付出代价,因为有一个 jOOQ 事务,一个单独的 Spring 事务,并且这两件事彼此不知道。
为什么不直接使用 Spring 的 @Transactional到处都是注释,而不是?

关于spring-boot - Spring :How to handle transactions for DB operations across services,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68387942/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com