news 2026/1/10 4:02:18

如何处理 丢失更新​(不可重复读​)

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
如何处理 丢失更新​(不可重复读​)

简单来说,就是在一个事务的生命周期内,其读取的数据被另一个并发事务修改并提交,导致数据状态发生变化,而当前事务基于已过时的数据进行了更新。

原因与问题分析

下表清晰地展示了这个问题的核心原因以及可能引发的具体并发问题:

问题点

描述

可能引发的并发问题

默认隔离级别

Spring中@Transactional的默认隔离级别是Isolation.DEFAULT,这通常意味着使用数据库的默认级别(MySQL为可重复读(REPEATABLE_READ),Oracle为读已提交(READ_COMMITTED))。

读已提交级别下,会发生不可重复读;在可重复读级别下,虽然能避免不可重复读,但仍可能发生幻读,并且如果更新逻辑设计不当,依然可能导致数据覆盖。

核心问题

您描述的场景关键在于:事务A读取数据后,事务B修改并提交了该数据。此时,事务A持有的数据副本已是过时版本。当事务A基于此旧数据计算并进行更新时,就会覆盖事务B已提交的更改,造成数据丢失。

丢失更新​ 。

解决方案

解决这个问题,主要有以下几种策略,您可以根据业务场景的并发冲突概率和性能要求进行选择。

解决方案

实现方式

适用场景

1. 提高事务隔离级别

将方法的事务隔离级别设置为Isolation.SERIALIZABLE(最高级别)。这会强制事务串行执行,彻底解决并发问题,但性能开销最大,一般不推荐。

对数据一致性要求极高,且并发量不大的场景。

2. 使用悲观锁

在查询数据的SQL语句后添加FOR UPDATE(如:SELECT * FROM table WHERE ... FOR UPDATE)。这会直接锁定目标行,阻止其他事务修改,直到当前事务结束。

并发冲突频繁,且事务执行时间较短的场景。这是一种“先锁后改”的策略。

3. 使用乐观锁(推荐)

在数据库表中增加一个version(版本号)字段。更新时,在SQL语句中同时检查版本号是否未变,并将版本号+1。例如:UPDATE table SET ..., version = version + 1 WHERE id = ? AND version = ?。如果版本号不匹配,则更新失败。

并发冲突不频繁的大多数场景。性能最好,是一种“先改再看”的策略。

4. 使用分布式锁

对于分布式系统,可以使用如Redisson等工具,在业务层对关键资源(如订单ID)加锁,确保同一时间只有一个线程能执行“查询-计算-更新”的完整流程。

分布式应用环境,需要跨JVM保证资源独占。

如何选择?

  • 如果您的应用并发冲突概率不高乐观锁通常是最佳选择,因为它性能最好,实现也相对简单。

  • 如果冲突非常频繁,或者事务本身很短:可以考虑使用悲观锁FOR UPDATE)。

  • 一般情况下,不建议使用SERIALIZABLE隔离级别,因为对数据库性能影响太大。

希望这些解释和方案能帮助您更好地处理Spring事务中的并发问题。如果您想了解某个方案的具体代码实现细节,我可以为您提供更详细的说明。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2025/12/31 15:06:38

PyTorch-CUDA-v2.6镜像中使用Git管理机器学习代码的最佳实践

PyTorch-CUDA-v2.6 镜像中使用 Git 管理机器学习代码的最佳实践 在深度学习项目开发中,我们常常会遇到这样的场景:一个模型昨天还能跑出 95% 的准确率,今天却再也复现不了;团队成员提交的代码互相覆盖,导致关键功能丢…

作者头像 李华
网站建设 2026/1/8 8:08:28

通过GNU Radio可视化界面控制SDR硬件通俗解释

用鼠标“画”出一台收音机:GNU Radio 是如何让普通人玩转 SDR 的?你有没有想过,只靠一台几十块钱的 USB 接收器和一个图形界面软件,就能监听 FM 广播、接收飞机ADS-B信号、甚至解码气象卫星图像?这背后的核心技术&…

作者头像 李华
网站建设 2026/1/1 0:40:22

蜂鸣器在工业报警中的应用:核心要点解析

蜂鸣器在工业报警中的应用:从原理到实战的深度拆解你有没有遇到过这样的场景?一台设备突然停机,操作屏上没有任何提示,而旁边的同事却说:“刚才好像听见‘嘀’了一声?”——这正是蜂鸣器在关键时刻发出的求…

作者头像 李华
网站建设 2026/1/5 14:37:25

PyTorch-CUDA-v2.6镜像发布:专为大模型token生成优化的GPU环境

PyTorch-CUDA-v2.6镜像发布:专为大模型token生成优化的GPU环境 在大模型推理日益成为AI产品核心能力的今天,一个常见却令人头疼的问题是:为什么同样的模型,在不同机器上跑出来的速度差了三倍?更别提那些因驱动版本不匹…

作者头像 李华
网站建设 2025/12/29 1:58:41

PyTorch-CUDA-v2.6镜像如何实现多卡并行训练?技术细节曝光

PyTorch-CUDA-v2.6镜像如何实现多卡并行训练?技术细节曝光 在当前大模型时代,单张GPU已经远远无法满足训练效率的需求。从BERT到LLaMA,模型参数动辄数十亿甚至上千亿,训练任务对算力的渴求达到了前所未有的高度。面对这一挑战&…

作者头像 李华
网站建设 2026/1/3 21:49:01

Docker快速搭建Elasticsearch安装环境通俗解释

用 Docker 几分钟搭起 Elasticsearch,新手也能轻松上手 你有没有遇到过这种情况:想试试 Elasticsearch 的全文检索功能,刚打开官网准备安装,就看到一堆 JVM 参数、系统内核调优、YAML 配置文件……还没开始写代码,光是…

作者头像 李华