Spring JPA 原子获取或创建方法

Spring JPA atomic get or create method

我正在使用 Spring 引导和 JPA(使用 Hibernate)。

我有一个方法(进入我的服务):

显然,我需要保证此方法原子性

我必须避免在数据库中创建重复条目的风险的单独事务。

附加说明:关于用户 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