首页 > 解决方案 > 数据库隔离级别丢失更新防止

问题描述

我使用 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;
    }

我在多线程环境中测试了该方法。

它导致了比赛条件。

所以我将事务隔离级别设置为可重复读取级别或可序列化级别。

然而,竞争条件继续发生。

唯一的解决方案是在存储库中将 LockMode 指定为 findById 方法。

很多文档说事务隔离级别可以解决丢失更新问题。

但是,事务隔离级别并没有解决并发问题。

在这种情况下,为什么隔离级别不能解决丢失的更新?

许多文档将什么称为隔离级别?

如果隔离级别不能解决并发问题,那目的是什么?

测试环境为 h2 db

标签: databasespring-data-jpa

解决方案


推荐阅读