несколько экземпляров извлекают одну и ту же запись при использовании пессимистичной блокировки записи - PullRequest
0 голосов
/ 07 июля 2019

Мне нужно извлечь запись из базы данных с блокировкой, чтобы другие экземпляры не выбирали эту же запись из базы данных. Я использую пружинный jpa данных с пессимистичной блокировкой записи, когда запускаю один экземпляр службы (serviceA ) нет проблем, но когда я запускаю два экземпляра (serviceA и serviceB), оба экземпляра выбирают одну и ту же запись из базы данных. Например, у меня есть serviceA, который извлекает запись «item1», которая первоначально будет в состоянии «OPEN» сразу после извлечения, я немедленно изменю состояние item1 на «INPROGRESS» в БД, чтобы другой экземпляр serviceB не выбирал эту запись из DB поскольку оба экземпляра (serviceA и serviceB) будут выбирать только те элементы, которые находятся в состоянии «открыто». Проблема здесь в том, что serviceA выбирает и обновляет статус записи item1 (с ОТКРЫТОГО до INPROGRESS) в db serviceB выбирает тот же item1, как только serviceA снимает блокировку 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 не должен извлекать тот же элемент1, он должен извлекать другие элементы, находящиеся в открытом состоянии

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...