Spring boot jpa防止自动更新

问题描述 投票:0回答:1

我对Jpa和并发访问有疑问。这里是示例代码

用户

@Entity
public class User {

    @Id
    @GeneratedValue
    private Long id;

    private String firstName;

    private String lastName;

    ...

UserService

public class UserService {

    private final UserRepository userRepository;

    public UserService(UserRepository userRepository) {
        this.userRepository = userRepository;
    }

    @Transactional
    public String getFirstName(Long userId) throws InterruptedException {
        User user = userRepository.findById(userId).get();
        Thread.sleep(5000L); // 5s
        // ...
        return user.getFirstname();
    }

    @Transactional
    public void updateUser(Long userId, String firstName, String lastName) {
        User user = userRepository.findById(userId).get();
        user.setFirstname(firstName);
        user.setLastname(lastName);
        userRepository.save(user);
    }
}

如果我同时调用两个端点(在POST之前先获取GET),则getFirstName方法将覆盖更新,因为在事务结束时,即使没有更新,JPA也会进行隐式保存。我的更新将被覆盖,因为在我的getFirstName方法开始时,我使用旧的名字加载用户

如果我们不调用存储库的save方法,是否可以禁用同步?我不想每次都分离实体。此外,我不想将事务置于只读状态(也许我需要在getFirstName方法中更新另一个实体)。

如果不进行任何更改,我不希望JPA自动保存我的实体。由于并发访问,可能会出现问题。

谢谢

spring spring-boot jpa
1个回答
0
投票

通过删除@ Transactional,persistanceContext将不会被刷新。或者,您可以使用@Transactional(readOnly = true)。您可以在此处了解更多信息:https://vladmihalcea.com/spring-read-only-transaction-hibernate-optimization/

© www.soinside.com 2019 - 2024. All rights reserved.