Hibernate 调试@Lock-in-Spring数据JPA
在Spring Data JPA中,当我将Hibernate 调试@Lock-in-Spring数据JPA,hibernate,spring-boot,logging,spring-data-jpa,locking,Hibernate,Spring Boot,Logging,Spring Data Jpa,Locking,在Spring Data JPA中,当我将@namedquerys与lockMode=LockModeType.WRITE一起使用时,我可以在日志中看到结果(假设JPA.show sql为true): 但是,当我在方法上使用@Lock(LockModeType.WRITE)注释时,我在日志中看不到任何内容。我想确保锁定机制按预期工作 我如何才能看到@Lock(LockModeType.WRITE)正在工作?应该启用什么日志级别 编辑:以下是我的代码摘录: @Service public cla
@namedquerys
与lockMode=LockModeType.WRITE一起使用时,我可以在日志中看到结果(假设JPA.show sql
为true
):
但是,当我在方法上使用@Lock(LockModeType.WRITE)
注释时,我在日志中看不到任何内容。我想确保锁定机制按预期工作
我如何才能看到@Lock(LockModeType.WRITE)
正在工作?应该启用什么日志级别
编辑:以下是我的代码摘录:
@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\u FORCE\u imrement的同义词
@Lock(LockModeType.PESSIMISTIC_WRITE)
您还可以从服务方法中删除@Lock
,因为@Lock
只对存储库方法有效。将@Transactional
添加到相应的服务方法中也很重要
在此处阅读有关锁定模式的更多信息
要确保:您已将此注释设置为JpaRepository中的查询方法?@SimonMartinelli:我在JpaRepository中的方法上设置了@Lock
。另外,我还尝试在使用存储库的@Service
中的一个方法上设置它(只是出于好奇);请看编辑后的问题。我添加了代码的摘录。它实际上试图通过用户的电子邮件、(常规)密码和验证码对用户进行身份验证。如果一切正常,则在数据库中设置最后一个验证码。我想锁定一个用户对应的行,这样就不会有两个线程(事务)同时读写它。非常感谢。以下是来自Java EE 8的LockModeType
文档,供将来参考:
@Lock(LockModeType.PESSIMISTIC_WRITE)