【发布时间】:2020-07-20 07:58:31
【问题描述】:
我正在使用 Spring Boot 和 JPA(使用 Hibernate)。
我有一个方法(进入我的服务):
- 检查数据库中是否已经存在特定实体(例如 I 需要检查是否已经有用户。为此,我使用自定义 JPQL 查询我的 JPA 存储库。
- 在此之后,如果上一步没有任何结果,我将在数据库中创建条目(使用保存 JPA 存储库方法)同时我还需要创建一个其他实体(对于例如一些与用户相关的信息存储到一个单独的表中)。 因此,在这种情况下,我将有两个 create-query(一个用于 User 表,一个用于 Info-User 表)。
- 如果步骤 1 已经有一些结果,我显然需要跳过插入步骤。
显然,我需要保证这个方法的原子性。
我必须避免可能在数据库中创建重复条目的单独事务。
附加说明:在用户表上,我无法添加一些唯一约束,因为对此有一些不同的组合(例如,如果状态为某个值或类似的值,我可以再次创建相同的用户) .
我尝试在我的方法中仅使用 @Transactional 注释,但我注意到这还不够(使用一些压力测试,我可以在数据库中创建多行)。
所以现在我很困惑。
拥有原子方法的最佳实践是什么?
我需要更改Transaction Isolation level 吗?我需要使用一些Locks吗?
我不是 Spring 专家,但我认为这是一个常见问题,但我无法理解正确的方法。
基本上我正在寻找使用 JPA(和 JPA 存储库)的原子 GET_OR_CREATE 方法
【问题讨论】:
标签: java spring hibernate jpa spring-transactions