在 Spring 数据 JPA 中调试 @Lock
Debugging @Lock in Spring Data JPA
在 Spring Data JPA 中,当我将 @NamedQueries
与 lockMode = LockModeType.WRITE
一起使用时,我可以在日志中看到结果(假设 jpa.show-sql
是 true
):
... 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;
}
}
你用错了LockModeType
:LockModeType.WRITE
是LockModeType.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
在 Spring Data JPA 中,当我将 @NamedQueries
与 lockMode = LockModeType.WRITE
一起使用时,我可以在日志中看到结果(假设 jpa.show-sql
是 true
):
... 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;
}
}
你用错了LockModeType
:LockModeType.WRITE
是LockModeType.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