Spring JPA 原子获取或创建方法
Spring JPA atomic get or create method
我正在使用 Spring 引导和 JPA
(使用 Hibernate
)。
我有一个方法(进入我的服务):
- 检查数据库中是否已经存在特定实体(例如我
需要检查是否已经有用户。为此,我使用自定义 JPQL
查询我的 JPA 存储库。
- 在此之后,如果上一步没有任何结果,我将在数据库中创建条目(使用保存 JPA 存储库方法)同时我还需要创建另一个实体(例如,一些与用户相关的信息存储在一个单独的 table 中)。
因此,在这种情况下,我将有两个创建查询(一个用于用户 table,一个用于信息用户 table)。
- 如果第 1 步已经有一些结果,显然我需要跳过插入步骤。
显然,我需要保证此方法原子性。
我必须避免在数据库中创建重复条目的风险的单独事务。
附加说明:关于用户 table 我无法添加一些独特的约束,因为对此有一些不同的组合(例如,如果状态处于特定状态,我可以再次创建相同的用户价值或类似的东西)。
我尝试只对我的方法使用 @Transactional
注释,但我注意到这还不够(使用一些压力测试我能够在数据库中创建多行)。
所以现在我很困惑。
拥有原子方法的最佳实践是什么?
我必须更改 Transaction Isolation level
吗?我需要使用一些 Locks
吗?
我不是 Spring 专家,但我认为这是一个常见问题,但我无法理解正确的方法。
基本上我正在寻找使用 JPA(和 JPA 存储库)的原子 GET_OR_CREATE 方法
在这种情况下,您需要将事务隔离级别设置为SERIALIZABLE
,即只有一个事务可以访问数据库。这可以使用 Transactional
注释的 isolation
属性来完成:
@Transactional(isolation = Isolation.SERIALIZABLE)
public void yourMethod(){
// ...
}
在此处阅读有关该主题的更多信息:https://www.baeldung.com/spring-transactional-propagation-isolation
我正在使用 Spring 引导和 JPA
(使用 Hibernate
)。
我有一个方法(进入我的服务):
- 检查数据库中是否已经存在特定实体(例如我 需要检查是否已经有用户。为此,我使用自定义 JPQL 查询我的 JPA 存储库。
- 在此之后,如果上一步没有任何结果,我将在数据库中创建条目(使用保存 JPA 存储库方法)同时我还需要创建另一个实体(例如,一些与用户相关的信息存储在一个单独的 table 中)。 因此,在这种情况下,我将有两个创建查询(一个用于用户 table,一个用于信息用户 table)。
- 如果第 1 步已经有一些结果,显然我需要跳过插入步骤。
显然,我需要保证此方法原子性。
我必须避免在数据库中创建重复条目的风险的单独事务。
附加说明:关于用户 table 我无法添加一些独特的约束,因为对此有一些不同的组合(例如,如果状态处于特定状态,我可以再次创建相同的用户价值或类似的东西)。
我尝试只对我的方法使用 @Transactional
注释,但我注意到这还不够(使用一些压力测试我能够在数据库中创建多行)。
所以现在我很困惑。
拥有原子方法的最佳实践是什么?
我必须更改 Transaction Isolation level
吗?我需要使用一些 Locks
吗?
我不是 Spring 专家,但我认为这是一个常见问题,但我无法理解正确的方法。
基本上我正在寻找使用 JPA(和 JPA 存储库)的原子 GET_OR_CREATE 方法
在这种情况下,您需要将事务隔离级别设置为SERIALIZABLE
,即只有一个事务可以访问数据库。这可以使用 Transactional
注释的 isolation
属性来完成:
@Transactional(isolation = Isolation.SERIALIZABLE)
public void yourMethod(){
// ...
}
在此处阅读有关该主题的更多信息:https://www.baeldung.com/spring-transactional-propagation-isolation