MySQL丢失更新问题的出现和解决

MySQL丢失更新问题的出现和解决

丢失更新问题(Lost Update)指的是两个或多个事务在读同一数据并基于此数据进行更新操作时,某些更新操作被覆盖或丢失。例如,事务A和事务B都读取了某个数据,然后事务A更新了该数据,而事务B在没有意识到事务A的更新的情况下,也更新了该数据,导致事务A的更新被覆盖。

丢失更新问题的出现原因

丢失更新问题通常在以下情况下出现:

  1. 无锁定的并发访问:多个事务同时读取并修改同一数据,而没有任何形式的锁定机制。
  2. 低隔离级别:在READ UNCOMMITTED或READ COMMITTED隔离级别下,事务可以看到其他未提交事务的修改,增加了丢失更新问题的可能性。

解决丢失更新问题的方法

1. 使用乐观锁

乐观锁通过在每次更新数据时检查数据是否在读取后被修改来避免丢失更新问题。常用的方法是添加一个版本号或时间戳字段,每次更新时检查版本号是否一致,不一致则说明数据已被其他事务修改,更新失败。

示例:

-- 添加版本号字段
ALTER TABLE my_table ADD COLUMN version INT DEFAULT 0;-- 更新数据时检查版本号
UPDATE my_table
SET value = 'new_value', version = version + 1
WHERE id = 1 AND version = 2;

2. 使用悲观锁

悲观锁通过锁定数据来防止其他事务同时访问和修改同一数据。MySQL提供了SELECT … FOR UPDATE语法来实现悲观锁。

示例:

-- 锁定数据
START TRANSACTION;
SELECT value FROM my_table WHERE id = 1 FOR UPDATE;-- 更新数据
UPDATE my_table SET value = 'new_value' WHERE id = 1;-- 提交事务
COMMIT;

3. 提升隔离级别

提升隔离级别可以减少并发事务对同一数据的访问冲突。将隔离级别设置为REPEATABLE READ或SERIALIZABLE可以有效防止丢失更新问题。

示例:

-- 设置事务隔离级别为REPEATABLE READ
SET SESSION TRANSACTION ISOLATION LEVEL REPEATABLE READ;-- 或者设置为SERIALIZABLE
SET SESSION TRANSACTION ISOLATION LEVEL SERIALIZABLE;

REPEATABLE READ 隔离级别下的丢失更新

尽管REPEATABLE READ隔离级别能够防止脏读和不可重复读,但在某些情况下仍可能出现丢失更新问题。在MySQL中,REPEATABLE READ隔离级别通过使用多版本并发控制(MVCC)来提供一致性视图,确保同一事务中多次读取的数据是一致的。然而,这并不能完全避免丢失更新问题,因为多个事务仍然可以基于相同的数据快照进行更新。

示例

假设有一个表 account,其中包含字段 idbalance

CREATE TABLE account (id INT PRIMARY KEY,balance DECIMAL(10, 2)
);

现在有两个事务,事务A和事务B,都试图更新同一个账户的余额。

-- 事务A
START TRANSACTION;
SELECT balance FROM account WHERE id = 1;  -- 假设读取到的balance为100-- 事务B
START TRANSACTION;
SELECT balance FROM account WHERE id = 1;  -- 同样读取到的balance为100
UPDATE account SET balance = 80 WHERE id = 1;  -- 将余额减少20
COMMIT;-- 事务A
UPDATE account SET balance = 120 WHERE id = 1;  -- 将余额增加20(基于原始值100)
COMMIT;

在这种情况下,事务B的更新将会被事务A的更新覆盖,导致事务B的更新丢失。

解决方法

为了避免这种情况,可以结合使用悲观锁和适当的事务处理。

-- 事务A
START TRANSACTION;
SELECT balance FROM account WHERE id = 1 FOR UPDATE;  -- 加锁读取-- 事务B
START TRANSACTION;
SELECT balance FROM account WHERE id = 1 FOR UPDATE;  -- 尝试加锁,将被阻塞直到事务A完成-- 事务A
UPDATE account SET balance = 120 WHERE id = 1;
COMMIT;-- 事务B(在事务A完成后继续)
UPDATE account SET balance = 80 WHERE id = 1;
COMMIT;

通过使用 FOR UPDATE 加锁读取,可以确保在事务A完成之前,事务B无法读取到被锁定的数据,从而避免丢失更新问题。

参考链接

  • MySQL文档:MySQL 事务隔离级别

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/368255.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

使用Retrofit2+OkHttp监听上传或者下载进度会执行两次的问题

使用Retrofit2OkHttp监听上传或者下载进度RequestBody#writeTo/ResponseBody#source 会执行两次的问题 example: 问题原因: 使用了HttpLoggingInterceptor拦截器,并且日志等级为HttpLoggingInterceptor.Level.BODY 问题解决:

【CT】LeetCode手撕—1143. 最长公共子序列

目录 题目1- 思路2- 实现⭐1143. 最长公共子序列——题解思路 3- ACM 实现 题目 原题连接:1143. 最长公共子序列 1- 思路 模式识别:最长公共子序列——> 动规五部曲 2- 实现 ⭐1143. 最长公共子序列——题解思路 class Solution {public int longe…

JVM 知识总结

是什么 JVM是Java Virtual Machine(Java虚拟机)的缩写,是通过在实际的计算机上仿真模拟各种计算机功能来实现的。由一套字节码指令集、一组寄存器、一个栈、一个垃圾回收堆和一个存储方法域等组成。JVM屏蔽了与操作系统平台相关的信息&#…

离线翻译app哪个好用?轻松对话就靠这5个

最近大家应该都顺利渡过了期末考,打算趁着暑假好好来一趟“说走就走”的国外行吧?说到出国游,那怎么能少得了诸如“离线翻译器”这种对话利器呢!即使是在网络转态不佳,甚至没网的情况下,也都能安心让你实现…

leetcode hot100

哈希 49.字母异位词分组 HashMap的含义比较晕,可以重做 双指针 11.盛最多水的容器 双指针的起始位置和移动条件没转过来,可以重做 15.三数之和 不太熟练,可以再做一遍 42.接雨水 还可以用dp和单调栈做 双指针法: 首先需要注意…

Python特征工程 — 1.3 对数与指数变换

目录 1 对数变换 1.1 对数变换的概念 1.2 对数变换实战 2 指数变换 2.1 指数变换的概念 2.2 指数变换实战 3 Box-Cox变换 3.1 Box-Cox变换概念 3.2 Box-Cox变换实战 1 对数变换 1.1 对数变换的概念 特征对数变换和指数变换是数据预处理中的两种常用技术,…

工厂自动化相关设备工业一体机起到什么作用?

在当今的制造业领域,工厂自动化已成为提高生产效率、保证产品质量和降低成本的关键。在这一进程中,工业一体机作为一种重要的设备,发挥着不可或缺的作用。 工业一体机是自动化生产线上的控制中心。它能够整合和处理来自各个传感器、执行器和其…

【机器学习】机器学习与医疗健康在疾病预测中的融合应用与性能优化新探索

文章目录 引言第一章:机器学习在医疗健康中的应用1.1 数据预处理1.1.1 数据清洗1.1.2 数据归一化1.1.3 特征工程 1.2 模型选择1.2.1 逻辑回归1.2.2 决策树1.2.3 随机森林1.2.4 支持向量机1.2.5 神经网络 1.3 模型训练1.3.1 梯度下降1.3.2 随机梯度下降1.3.3 Adam优化…

ctfshow-web入门-命令执行(web71-web74)

目录 1、web71 2、web72 3、web73 4、web74 1、web71 像上一题那样扫描但是输出全是问号 查看提示:我们可以结合 exit() 函数执行php代码让后面的匹配缓冲区不执行直接退出。 payload: cvar_export(scandir(/));exit(); 同理读取 flag.txt cinclud…

kali下安装使用蚁剑(AntSword)

目录 0x00 介绍0x01 安装0x02 使用1. 设置代理2. 请求头配置3. 编码器 0x00 介绍 蚁剑(AntSword)是一个webshell管理工具。 官方文档:https://www.yuque.com/antswordproject/antsword 0x01 安装 在kali中安装蚁剑,分为两部分&am…

AI 驱动的数据中心变革与前景

文章主要探讨了AI计算时代数据中心的转型,涉及计算技术的多样性、规格尺寸和加速器的发展、大型语言模型(LLM)的发展、功耗和冷却趋势、基准测试的重要性以及数据中心的发展等方面。为大家提供深入了解AI基础设施发展的视角。 计算技术的多样…

IDEA 一键部署Docker

以部署示例服务(sevnce-demo)为例。 配置服务器 地址、账号、密码根据实际情况填写 配置镜像仓库 地址、账号、密码根据实际情况填写 编写Dockerfile 在sevnce-demo根目录下右键,选择创建Dockerfile。 # 基础镜像 FROM sevnce-registry.c…

使用Vue CLI方式创建Vue3.0应用程序

Vue CLI 是一个基于 Vue.js 进行快速开发的完整系统。新版本的 Vue CLI 的包名由原来的 vue-cli 改成了 vue/cli。 在开发大型项目时,需要考虑项目的组织结构、项目构建和部署等问题。如果手动完成这些配置工作,工作效率会非常低。为此,Vue.…

【博士每天一篇文献-综述】A survey on few-shot class-incremental learning

阅读时间:2023-12-19 1 介绍 年份:2024 作者:田松松,中国科学院半导体研究所;李璐思,老道明大学助理教授;李伟军,中国科学院半导体研究所AnnLab; 期刊: Neu…

新型发电系统——光伏行业推动能源转型

一、发展背景 “十四五”期间,随着“双碳”目标提出及逐步落实,本就呈现出较好发展势头的分布式光伏发展有望大幅提速。就“十四五”光伏发展规划,国家发改委能源研究所可再生能源发展中心副主任陶冶表示,“双碳”目标意味着国家…

【linux】网络基础(3)——tcp协议

文章目录 TCP协议概括TCP头部格式TCP连接管理建立连接(三次握手)数据传输确认应答机制捎带应答 滑动窗口丢包问题 拥塞控制延时应达 终止连接(四次挥手) TCP协议概括 TCP是一个面向连接的协议,在传输数据之前需要建立连…

04.C1W3.Vector Space Models

目录 Vector Space ModelsWord by Word and Word by DocWord by Document DesignWord by Document DesignVector Space Euclidean DistanceEuclidean distance for n-dimensional vectors Euclidean distance in PythonCosine Similarity: IntuitionCosine SimilarityPrevious …

2024鲲鹏昇腾创新大赛集训营Ascend C算子学习笔记

异构计算架构(CANN) 对标英伟达的CUDA CuDNN的核心软件层,向上支持多种AI框架,向下服务AI处理器,发挥承上启下的关键作用,是提升昇腾AI处理器计算效率的关键平台。主要包括有各种引擎、编译器、执行器、算…

Tomcat的安装和虚拟主机和context配置

一、 安装Tomcat 注意:安装 tomcat 前必须先部署JDK 1. 安装JDK 方法1:Oracle JDK 的二进制文件安装 [rootnode5 ~]# mkdir /data [rootnode5 ~]# cd /data/ [rootnode5 data]# rz[rootnode5 data]# ls jdk-8u291-linux-x64.tar.gz [rootnode5 data]…

七、函数练习

目录 1. 写一个函数可以判断一个数是不是素数。(素数只能被1或其本身整除的数) 2. 一个函数判断一年是不是闰年。 3.写一个函数,实现一个整形有序数组的二分查找。 4. 写一个函数,每调用一次这个函数,使得num每次增…