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
注释方法进行更新,后者会更新线程上下文的全局事务状态.
由于您可能正在向所有服务注入包含 Configuration
和 DataSource
的 jOOQ DSLContext
,因此您必须再次删除它,并传递事务 DSLContext
您 更喜欢 使用。这并非不可能,但它在“Spring 世界”中并不是惯用的。每次你忘记这一点,你都会付出代价,因为有一个 jOOQ 交易,一个单独的 Spring 交易,并且这两件事彼此不知道。
为什么不到处使用 Spring 的 @Transactional
注释呢?
我想了解如何在 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
注释方法进行更新,后者会更新线程上下文的全局事务状态.
由于您可能正在向所有服务注入包含 Configuration
和 DataSource
的 jOOQ DSLContext
,因此您必须再次删除它,并传递事务 DSLContext
您 更喜欢 使用。这并非不可能,但它在“Spring 世界”中并不是惯用的。每次你忘记这一点,你都会付出代价,因为有一个 jOOQ 交易,一个单独的 Spring 交易,并且这两件事彼此不知道。
为什么不到处使用 Spring 的 @Transactional
注释呢?