我使用 spring data jpa 编写了以下事务。
@Override
@Transactional
public boolean removeAvailableStock(Long itemId, Long quantity) {
ItemEntity itemEntity = itemRepository.findById(itemId).orElseThrow(NoSuchItemException::new);
itemEntity.removeAvailableStock(quantity);
return true;
}
我在多线程环境中测试了该方法。
它导致了竞争条件。
所以我将事务隔离级别设置为可重复读取级别或可序列化级别。
然而,竞争条件继续发生。
唯一的解决方案是在存储库中为 findById 方法指定 LockMode。
很多文档都说事务隔离级别可以解决更新丢失的问题。
但是,事务隔离级别并没有解决并发问题。
在这种情况下,为什么隔离级别不能解决丢失的更新?
许多文档将隔离级别称为什么?
如果隔离级别不能解决并发问题,那目的是什么?
测试环境为h2 db