多个实例在使用悲观写锁定时获取同一条记录

时间:2019-07-07 08:39:50

标签: java spring-boot spring-data-jpa locking pessimistic-locking

我需要从数据库上获取锁定的记录,以便其他实例不会从db提取相同的记录。当我运行单个service(serviceA实例时,我正在使用带有悲观写锁定的spring数据jpa )没有问题,但是当我运行两个实例(serviceA和serviceB)时,两个实例都从数据库中获取相同的记录。例如,我有一个serviceA,它获取一条记录“ item1”,该记录在获取后立即立即处于状态“ OPEN”,我将立即在db中将item1的状态更改为“ INPROGRESS”,以便其他实例serviceB不会从数据库中选择该记录。因为实例(serviceA和serviceB)都将仅获取处于“打开”状态的项目。即使serviceA在数据库中选择并更新了item1记录的状态(从OPEN到INPROGRESS),这里的问题仍然是存在的,一旦serviceA释放了对item1的锁定,服务B就会获取相同的item1

public interface WalletRepository extends CrudRepository<Wallet, Long>, JpaSpecificationExecutor<Wallet> {

    @Lock(LockModeType.PESSIMISTIC_WRITE)
    Wallet findByStatusId(String statusId);
}

@Service
public class WidgetServiceImpl implements WidgetService
{

  @Autowired
  private WalletRepository repo;

  @Transactional
  public void updateWidgetStock(StringstausId, int count)
  {
    Wallet w = this.repo.findByStatusId(stausId); //status Id "OPEN"
    w.setSatusId("INPROGRESS");
    this.repo.save(w);
  }
}

如果serviceA选择了item1,则serviceB不应获取相同的item1,而应获取处于打开状态的其他项目

0 个答案:

没有答案