database - 数据库隔离级别丢失更新防止
问题描述
我使用 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
解决方案
推荐阅读
- outlook - 关闭 Outlook 提醒会触发 MS Graph API 事件更改通知和 ChangeKey 更改,有什么方法可以避免?
- c++ - 如何使用 C++ 程序截取 FSX 的屏幕截图?
- lucene - Lucene:TokenFilter 替换字符并生成新的标记作为同义词
- c# - HTML 在 C# ASP.NET MVC 中无法与字符串生成器一起正常工作
- mysql - 如何通过join sql查询多个匹配项
- java - Scala/Java 解析日期未知格式
- flask - Flask——简单的 LDAP 设置问题
- docker - 设置 Elastic Enterprise Search 和 App Search - Docker - ELK
- query-optimization - 如何解决 Keystone.js 中的“N+1”问题
- pdf - 使用 openssl 在 pdf 文档上使用自签名证书进行签名