Мне нужно извлечь запись из базы данных с блокировкой, чтобы другие экземпляры не выбирали эту же запись из базы данных. Я использую пружинный 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, он должен извлекать другие элементы, находящиеся в открытом состоянии