在 Spring 数据 JPA 中调试 @Lock

Debugging @Lock in Spring Data JPA

在 Spring Data JPA 中,当我将 @NamedQuerieslockMode = LockModeType.WRITE 一起使用时,我可以在日志中看到结果(假设 jpa.show-sqltrue ):

... SELECT ... FOR UPDATE

但是,当我在方法上使用 @Lock(LockModeType.WRITE) 注释时,我在日志中看不到任何内容。我想确保锁定机制按预期工作。

How can I see that @Lock(LockModeType.WRITE) is working? What log level should be enabled?


编辑: 这是我的代码的摘录:

@Service
public class UserService {
    private final UserRepository userRepository;

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

    @Lock(LockModeType.PESSIMISTIC_WRITE)
    @Transactional
    public User checkCredentials(String email, String password, String verificationCode)
            throws BadCredentialsException {

        User user = userRepository.findByEmail(email);
        if(user == null)
            throw new BadCredentialsException("Invalid username");

        ...

        user.setLastVerificationCode(verificationCode);
        userRepository.save(user);

        return user;
    }
}

你用错了LockModeTypeLockModeType.WRITELockModeType.OPTIMISTIC_FORCE_IMCREMENT

的同义词
@Lock(LockModeType.PESSIMISTIC_WRITE)

并且您可以从 service 方法中删除 @Lock,因为 @Lock 仅适用于 repository方法。在相应的service方法中添加@Transactional也很重要。

在此处阅读有关 LockModes 的更多信息

https://docs.oracle.com/javaee/7/api/javax/persistence/LockModeType.html