首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >更新同一实体时的Spring Boot争用条件

更新同一实体时的Spring Boot争用条件
EN

Stack Overflow用户
提问于 2020-04-19 22:35:40
回答 1查看 368关注 0票数 1

对于spring boot,我理解如果我有一个函数可以减少用户的平衡,我们可以在服务方法中使用@Transactional注解,如下所示:

代码语言:javascript
复制
@Transactional
public void reduceBalance(long userId, BigDecimal usage) {
    ...
}

但我的问题并不是指将控件放在特定的函数上,我想知道的是:

代码语言:javascript
复制
public void updateAge(long userId, int newAge) {
    User theUser = userRepository.findById(userId).orElse(null); // Line A-1
    theUser.setAge(newAge); // Line A-2
    userRepository.save(theUser); // Line A-3
}

public void updateName(long userId, String newName) {
    User theUser = userRepository.findById(userId).orElse(null); // Line B-1
    theUser.setName(newName); // Line B-2
    userRepository.save(theUser); // Line B-3
}

假设两个请求同时进入,A-1和B-1行同时执行,然后是A-2和B-2,然后是A-3和B-3。

B-3会覆盖A-2更改吗?如果是,这是不是意味着我们应该在每个服务中都使用@Transactional注解,或者实际上有更好的设计?

EN

回答 1

Stack Overflow用户

发布于 2020-04-20 00:50:32

强烈建议在每个服务中使用@Transaction,但如果您想通过不同的方式进行管理,另一种方法是使用@Version注解

代码语言:javascript
复制
 Specifies the version field or property of an entity class that
 serves as its optimistic lock value.  The version is used to ensure
 integrity when performing the merge operation and for optimistic
 concurrency control.
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/61306076

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档