我需要从数据库上获取锁定的记录,以便其他实例不会从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,而应获取处于打开状态的其他项目