mysql中与并发相关的问题?

news2025/1/26 15:23:42

今天我们来聊聊 MySQL 中与并发相关的一些问题。作为一名资深 Python 开发工程师,我觉得这些问题不仅关乎数据库的稳定性和数据的一致性,更与我们的代码实现和业务逻辑密切相关。

尤其是在高并发环境下,如何保证数据的一致性,如何防止脏读、不可重复读和幻读等问题,真的是每个程序员都必须知道的内容。今天就通过一些简单的代码示例和场景说明,让大家更加直观地理解这些问题。

首先,我们知道 MySQL 服务端支持多个客户端同时连接,这就意味着 MySQL 会在多个事务并发执行时进行资源的竞争和调度。

而并发执行的事务中,如果没有妥善的控制,就可能会遇到一些数据一致性问题。常见的这些问题包括脏读(Dirty Read)、不可重复读(Non-repeatable Read)和幻读(Phantom Read)。那么,具体它们是怎么发生的呢?

脏读(Dirty Read)

脏读是指一个事务读到了另一个事务未提交的脏数据。如果事务 A 修改了数据,但事务 A 并没有提交,而事务 B 读取到了事务 A 修改后的数据,那就产生了脏读。如果事务 A 随后回滚了,那么事务 B 得到的数据就是无效的。这种现象就叫做脏读。

图片

举个例子,假设我们有两个事务 A 和 B,事务 A 从数据库中读取了小林的余额数据,然后进行了一次修改,但没有提交。与此同时,事务 B 也读取了小林的余额数据,这时事务 B 看到的余额已经是事务 A 修改后的数据了,即便事务 A 最终回滚了。

-- 事务 A
START TRANSACTION;
UPDATE account SET balance = balance - 100 WHERE name = '小林';
-- 事务 A 没有提交

-- 事务 B
START TRANSACTION;
SELECT balance FROM account WHERE name = '小林';  -- 读到了事务 A 更新后的数据
-- 事务 B 没有更新数据,但可能会被脏数据影响

如果事务 A 最后执行回滚,那么事务 B 得到的数据就是过期数据,这就属于脏读。

如何避免脏读?
可以通过设置事务隔离级别来避免脏读,常用的隔离级别是 READ COMMITTED。在这个隔离级别下,事务 B 不会读取未提交的数据,从而避免了脏读的发生。

不可重复读(Non-repeatable Read)

不可重复读是指在同一个事务中,多次读取同一数据时,如果中间有其他事务修改了数据,就会导致前后两次读取的结果不一致。

图片

举个简单的例子,事务 A 从数据库中读取了小林的余额数据并进行了一些处理,接着事务 B 修改了余额并提交了。等事务 A 再次读取余额时,看到的数据就和第一次不一样了,这就是不可重复读。

-- 事务 A
START TRANSACTION;
SELECT balance FROM account WHERE name = '小林';  -- 读到 1000 元
-- 假设事务 A 在处理中

-- 事务 B
START TRANSACTION;
UPDATE account SET balance = balance + 500 WHERE name = '小林';  -- 修改余额
COMMIT;

-- 事务 A 再次读取
SELECT balance FROM account WHERE name = '小林';  -- 读到 1500 元

在上面的代码中,事务 A 在第一次读取时读到的是 1000 元,而在第二次读取时,却读到了 1500 元。造成这种现象的原因是事务 B 在事务 A 执行过程中对数据进行了修改,导致了数据不一致。

如何避免不可重复读?

可以通过使用更高的事务隔离级别来避免,比如 REPEATABLE READ。在这个隔离级别下,事务 A 不会因为其他事务的提交而看到不一致的数据。

幻读(Phantom Read)

幻读是指在同一个事务中,重复执行相同的查询时,查询结果的数量发生了变化。这种问题通常发生在对数据行进行插入、删除、更新等操作时。

如果在事务 A 查询某个条件下的记录时,事务 B 在事务 A 执行查询的过程中插入了符合条件的新记录,那么事务 A 进行第二次查询时就会看到额外的记录,从而产生幻读现象。

图片

举个例子,假设事务 A 查询余额大于 100 万的所有账户,得到了 5 条记录,然后事务 B 插入了一条新的余额大于 100 万的记录,提交事务后,事务 A 再次查询时发现记录数量变成了 6 条。这样就出现了幻读。

-- 事务 A
START TRANSACTION;
SELECT COUNT(*) FROM account WHERE balance > 1000000;  -- 查询到 5 条记录
-- 假设事务 A 在处理中

-- 事务 B
START TRANSACTION;
INSERT INTO account (name, balance) VALUES ('小张', 2000000);  -- 插入一条新记录
COMMIT;

-- 事务 A 再次查询
SELECT COUNT(*) FROM account WHERE balance > 1000000;  -- 查询到 6 条记录

在这个例子中,事务 A 在第一次查询时得到了 5 条记录,而在第二次查询时却得到了 6 条记录,产生了幻读现象。

如何避免幻读?
为了避免幻读问题,可以使用 SERIALIZABLE 隔离级别,它会强制事务之间的互斥,确保在一个事务运行期间不会有其他事务修改或插入数据,从而避免了幻读。

如何在 MySQL 中设置隔离级别?

MySQL 提供了不同的事务隔离级别,每种隔离级别可以有效地解决某些并发问题。常用的隔离级别有以下几种:

  1. READ UNCOMMITTED:最低的隔离级别,允许脏读。

  2. READ COMMITTED:防止脏读,但允许不可重复读和幻读。

  3. REPEATABLE READ:防止脏读和不可重复读,但允许幻读(MySQL 默认使用此级别)。

  4. SERIALIZABLE:最高的隔离级别,防止所有并发问题,但性能可能较差。

我们可以通过以下语句来设置事务隔离级别:

-- 设置隔离级别
SET SESSION TRANSACTION ISOLATION LEVEL REPEATABLE READ;

如果面试官问你:如何理解 MySQL 的事务隔离级别?

你的回答:

MySQL 提供了四种常见的事务隔离级别,每个级别的作用和影响如下:

  1. READ UNCOMMITTED:事务可以读取其他事务未提交的数据,可能出现脏读、不可重复读和幻读问题。

  2. READ COMMITTED:事务只能读取已提交的数据,避免了脏读问题,但仍可能发生不可重复读和幻读。

  3. REPEATABLE READ:事务在整个生命周期内读取的数据是固定的,避免了脏读和不可重复读问题,但在 MySQL 中,仍然可能出现幻读。

  4. SERIALIZABLE:事务完全串行化,避免了脏读、不可重复读和幻读问题,但会大幅影响性能。

在实际开发中,根据业务的需求选择合适的事务隔离级别非常重要。例如,如果对数据一致性要求非常高,可以选择 SERIALIZABLE,但如果对性能要求较高,可能会选择 REPEATABLE READREAD COMMITTED

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

(补)算法刷题Day19:BM55 没有重复项数字的全排列

题目链接 给出一组数字,返回该组数字的所有排列 例如: [1,2,3]的所有排列如下 [1,2,3],[1,3,2],[2,1,3],[2,3,1],[3,1,2], [3,2,1]. (以数字在数组中的位置靠前为优先级,按字典序排列输出。) 思路: 使用回…

ARM嵌入式学习--第八天(PWM)

PWM -PWM介绍 PWM(pulse Width Modulation)简称脉宽调制,是利用微处理器的数字输出来对模拟电路进行控制的一种非常有效的技术,广泛应用在测量,通信,工控等方面 PWM的频率 是指在1秒钟内,信号从…

neo4j 图表数据导入到 TuGraph

neo4j 图表数据导入到 TuGraph 代码文件说明后文 前言:近期在引入阿里的 TuGraph 图数据库,需要将 原 neo4j 数据导入到新的 tugraph 数据库中。预期走csv文件导入导出,但因为格式和数据库设计问题,操作起来比较麻烦(可能是个人没…

Docker介绍、安装、namespace、cgroup、镜像-Dya 01

0. 容器简介 从生活上来说,容器是一种工具,可以装东西的工具,如衣柜、背包、行李箱等等。 从IT技术方面来说,容器是一种全新的虚拟化技术,它提高了硬件资源利用率,结合k8s还可以让企业业务快速横向扩容、业…

鱼跃医疗获评2024年国家级“绿色工厂”,以绿色制造树立行业标杆

近日,工业和信息化部公布了2024年度绿色制造名单,鱼跃医疗凭借在绿色制造和可持续发展方面的卓越表现,成功入选并获评国家级“绿色工厂”。 “绿色工厂”是工信部为贯彻落实国家《工业绿色发展规划》,加快推动绿色制造体系建设&a…

建投数据与腾讯云数据库TDSQL完成产品兼容性互认证

近日,经与腾讯云联合测试,建投数据自主研发的人力资源信息管理系统V3.0、招聘管理系统V3.0、绩效管理系统V2.0、培训管理系统V3.0通过腾讯云数据库TDSQL的技术认证,符合腾讯企业标准的要求,产品兼容性良好,性能卓越。 …

Java-30 深入浅出 Spring - IoC 基础 启动IoC 纯XML启动 Bean、DI注入

点一下关注吧!!!非常感谢!!持续更新!!! 大数据篇正在更新!https://blog.csdn.net/w776341482/category_12713819.html 目前已经更新到了: MyBatis&#xff…

基础入门-Web应用蜜罐系统堡垒机运维API内外接口第三方拓展架构部署影响

知识点: 1、基础入门-Web应用-蜜罐系统 2、基础入门-Web应用-堡垒机运维 3、基础入门-Web应用-内外API接口 4、基础入门-Web应用-第三方拓展架构 一、演示案例-Web-拓展应用-蜜罐-钓鱼诱使 蜜罐:https://hfish.net/ 测试系统:Ubuntu 20.04 …

【长城杯】Web题 hello_web 解题思路

查看源代码发现路径提示 访问…/tips.php显示无用页面,怀疑…/被过滤,采用…/./形式,看到phpinfo()页面 注意到disable_functions,禁用了很多函数 访问hackme.php,看到页面源码 发现eval函数,包含base64 解密获得php代…

【测试】Pytest

建议关注、收藏! 目录 功能pytest 自动化测试工具。 功能 单元测试:用于验证代码的最小功能单元(如函数、方法)的正确性。 简单的语法:不需要继承特定类或使用复杂的结构。断言语句简化。 自动发现测试:P…

Python语法之字典

免责说明:此内容不包含嵌套字典 关注我更新更多初学实例 字典 一.字典的应用场景 思考:数据顺序发生变化,每个数据的下标也会随之变化,如何保证数据顺序变化前后能使用同一的 标准查找数据呢? 答:字典&#xff0c…

mysql客户端命令

目录 结束符 ; \g \G 中断输入 ctrl c 查看命令列表 help ? (\?) connect (\r) status (\s) delimiter (\d) exit (\q) quit (\q) tee (\T) ​编辑 notee (\t) prompt (\R) source (\.) system (\!) ​编辑 use (\u) help contents 结束符 ; \g \G 当我…

更频繁的 Android SDK 发布:更快的创新、更高的质量和更完善

Android 一直致力于让创新更快地进入用户手中。除了每年的平台发布之外,我们还投资了Project Treble、Mainline、Google Play 服务、每月安全更新和季度发布,为 Pixel Drops 提供支持。 未来,Android 将更频繁地发布 SDK,计划于 …

蓝卓总裁谭彰:AI+工业互联网推动制造业数字化转型

近日,新一代工业操作系统supOS6.0在2024中国5G工业互联网大会上重磅发布。 大会期间,工信部新闻宣传中心《人民邮电报》对蓝卓总裁谭彰就“工业互联网人工智能技术融合的思考”“supOS6.0的探索与实践”“未来工业互联网平台的发展方向”展开专题访谈&am…

【WRF-Urban】输入空间分布人为热排放数据的WRF运行全过程总结

目录 数据准备检查新增变量配置(如果有)WPS预处理修改namelist.wpsStep1: geogridStep2: ungribStep3: metgridWRF运行修改namelist.input调试namelist.input运行./real.exe运行./wrf.exe参考WRF模型的基本流程如下: 数据准备 空间分布热排放数据下载及制备可参见另一博客…

如何利用Python爬虫获得1688按关键字搜索商品

在当今的数字化时代,数据已成为企业竞争的核心资源。对于电商行业来说,了解市场动态、分析竞争对手、获取商品信息是至关重要的。Python作为一种强大的编程语言,其丰富的库和框架使得数据爬取变得简单易行。本文将介绍如何使用Python爬虫技术…

Python从0到100(七十三):Python OpenCV-OpenCV实现手势虚拟拖拽

前言: 零基础学Python:Python从0到100最新最全教程。 想做这件事情很久了,这次我更新了自己所写过的所有博客,汇集成了Python从0到100,共一百节课,帮助大家一个月时间里从零基础到学习Python基础语法、Python爬虫、Web开发、 计算机视觉、机器学习、神经网络以及人工智能…

【Go】-倒排索引的简单实现

目录 什么是倒排索引 定义 基本结构和原理 分词在倒排索引中的重要性 简单倒排索引的实现 接口定义 简单数据库的实现 倒排索引 正排索引 测试 总结 什么是倒排索引 定义 倒排索引(Inverted Index)是一种索引数据结构,它是文档检…

php生成图片

前提 开启dg2库 去掉前面的;注释&#xff0c;有的可能会带.dll后缀影响不大 extensiongd2代码 <?php $file imagecreate(100,50); //先生成图片资源$color imagecolorallocate($file,255,255,255); //白色$c imagecolorallocate($file,0,100,255);imagefill($file,0…

MySQL数据库——门诊管理系统数据库数据表

门诊系统数据库his 使用图形化工具或SQL语句在简明门诊管理系统数据库his中创建数据表&#xff0c;数据表结构见表2-3-9&#xff5e;表2-3-15所示。 表2-3-9 department&#xff08;科室信息表&#xff09; 字段名称 数据类型 长度 是否为空 说明 dep_ID int 否 科室…