使用休眠更新MySQL数据库时锁定行

时间:2018-07-11 13:34:05

标签: java spring hibernate jpa orm

我在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注释。请帮忙。谢谢!

1 个答案:

答案 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)