我在Java中使用ORM连接到mysql数据库。在Java中,我有一个API可更新db中的记录。但是,当我同时收到多个请求时,记录将两次更新,并且不一致。 我无法更改我的实体类以添加用于乐观锁的版本。没有那我怎么能保持持久性。代码如下:
public void updateRecord(String userId, Double amount) {
User user = userRepository.findById(userId);
double balance = user.getBalance();
user.setBalance(balance-amount);
userRepository.save(user);
}
我不确定这是我们使用悲观主义锁的地方,还是@Transactional注释。请帮忙。谢谢!
答案 0 :(得分:1)
如果您要使用悲观锁定而不是添加到userRepository
方法中
@Lock(LockModeType.PESSIMISTIC_WRITE)
@Query("select u from User u where u.id = :id")
User findByIdAndLock(@Param("id") Integer id);
并使用它代替findById
User user = userRepository.findByIdAndLock(userId);
此外,强烈建议从应用程序管理数据库事务。如果您在方法调用链中使用的@Transactional
最高不超过标记updateRecord
的位置。像这样:
@Transactional
public void updateRecord(String userId, Double amount)