【发布时间】:2023-02-26 18:56:30
【问题描述】:
在 Spring/Hibernate 应用程序中,两个事务在一个方法中执行。在执行第一个事务并保存实体后,数据库返回相应的 id。第二个实体需要此 ID,然后才能保存它。
@Transactional
public int createAndSaveUser(String username, String email) {
UserAccountBuilder userAccountBuilder = new UserAccountBuilder(username);
int id = userAccountBuilder.buildAndSave();
UserEmailBuilder userEmailBuilder = new UserEmailBuilder(id, email);
userEmailBuilder.buildAndSave();
return id;
}
构建器通过调用相应 JpaRepositories 的保存方法来保存实体。
由于 id 是由数据库生成的,我的理解是必须完成第一个事务才能获得该 id。如果第二个事务出了问题,那么第二个事务回滚,但是第一个事务不回滚,在数据库中留下一个没有业务的尸体。
我的问题:
如果出现错误,如何撤消已执行的交易?
非常感谢您的帮助
【问题讨论】:
-
您的代码是正确的,应该按预期工作。为什么你认为第一个插入不会回滚?
-
你的理解是错误的。保存实体后您将获得 ID。之后交易仍然可以继续。所以你有了这个 ID 就可以在第二笔交易中做你的事情了。如果失败,您将回滚您的第一笔交易。
-
因此,如果这段代码应该有效,但不幸的是它不起作用,我将不得不弄清楚问题出在哪里。目前,如果出现错误,只会回滚第二个事务。谢谢(你的)信息。
标签: spring hibernate jpa transactions spring-data