我正在使用 Spring Boot 和JPA
(with Hibernate
).
我有一个方法(进入我的服务):
- 检查数据库中是否已存在特定实体(例如我
需要检查是否已经有用户。为此,我使用自定义 JPQL
查询我的 JPA 存储库。
- 之后,如果上一步没有任何结果,我将创建数据库条目(使用保存 JPA 存储库方法),同时我还需要创建另一个实体(例如一些信息)与存储到单独表中的用户相关)。
因此,在这种情况下,我将有两个创建查询(一个用于用户表,一个用于信息用户表)。
- 如果步骤 1 已经有一些结果,我显然需要跳过插入步骤。
显然,我需要保证该方法的原子性.
我必须避免单独的事务,以免在数据库中创建重复条目。
附加说明:在“用户”表上,我无法添加一些唯一约束,因为有一些不同的组合(例如,如果状态处于某个值或类似的值,我可以再次创建相同的用户)。
我尝试只使用@Transactional
我的方法的注释,但我注意到这还不够(使用一些压力测试,我可以在数据库中创建多行)。
所以现在我很困惑。
原子方法的最佳实践是什么?
我需要改变吗Transaction Isolation level
?我需要使用一些吗Locks
?
我不是 Spring 专家,但我认为这是一个常见问题,但我无法理解什么是正确的方法。
基本上我正在寻找使用 JPA (和 JPA 存储库)的原子 GET_OR_CREATE 方法
在这种情况下,您需要将事务隔离级别设置为SERIALIZABLE
只有一个事务可以访问数据库。这可以使用以下方法完成isolation
的属性Transactional
注解:
@Transactional(isolation = Isolation.SERIALIZABLE)
public void yourMethod(){
// ...
}
在这里阅读有关该主题的更多信息:https://www.baeldung.com/spring-transactional-propagation-isolation https://www.baeldung.com/spring-transactional-propagation-isolation
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)