讲师中心 微信公众号
AI工具推荐 视频效率加速

SQL数据库并发控制_锁与MVCC工作机制

陌丽君_6683

陌丽君_6683

发布时间:2026-01-05 20:29:02

|

257人浏览过

|

来源于php中文网

原创

SQL数据库并发控制由锁机制与MVCC协同实现:锁保障写安全(如X锁防并发修改),MVCC提升读性能(通过版本链与Read View实现快照读);二者分工为“读不阻塞读/写,写阻塞写/部分读”。

sql数据库并发控制_锁与mvcc工作机制

SQL数据库的并发控制主要靠锁机制和多版本并发控制(MVCC)协同实现,二者解决的核心问题是:多个事务同时读写同一数据时,如何保证一致性、隔离性,又不严重牺牲性能。

锁机制:显式阻塞,保障写操作安全

锁是数据库最基础的并发控制手段,按粒度分为行锁、页锁、表锁;按功能分为共享锁(S锁,用于读)、排他锁(X锁,用于写)。事务在修改数据前必须先获得对应行的X锁,其他事务若想读或写该行,就得等待锁释放——这就是“阻塞式”控制。

  • 读已提交(RC)级别下,SELECT不加锁(快照读),但UPDATE/DELETE会加行级X锁,并在语句执行完立即释放
  • 可重复读(RR)级别下,SELECT可能触发间隙锁(Gap Lock)或临键锁(Next-Key Lock),防止幻读;X锁则持续到事务结束
  • 死锁不可避免,数据库通过超时检测或等待图分析自动回滚其中一个事务

MVCC:隐式多版本,提升读性能与并发度

MVCC不依赖锁来处理读请求,而是为每一行数据维护多个历史版本,每个事务根据自己的“快照时间点”看到对应的一致性视图。InnoDB中通过隐藏字段DB_TRX_ID(最近修改事务ID)和DB_ROLL_PTR(指向undo日志的指针)实现版本链管理。

  • 事务开启时获取一个唯一的、递增的read view,其中包含活跃事务ID列表和最小未提交事务ID
  • 查询时遍历版本链,跳过对当前事务不可见的版本(如被更晚事务修改、或属于未提交事务)
  • INSERT生成新版本,DELETE标记删除版本,UPDATE实际是INSERT+DELETE组合,旧版本保留在undo log中供回滚或快照读使用

锁与MVCC如何配合工作

它们不是互斥方案,而是分工协作:MVCC负责“读不阻塞读、读不阻塞写”,锁机制负责“写阻塞写、写阻塞部分读”。例如在RR隔离级别下:

  • 普通SELECT走MVCC快照读,无需加锁,不会被UPDATE阻塞
  • SELECT ... FOR UPDATE 或 SELECT ... LOCK IN SHARE MODE 则走当前读,会加锁并触发最新版本可见性判断
  • UPDATE先用MVCC定位要修改的行版本,再加X锁,确保修改期间无人并发更改

实际开发中需注意的关键点

理解底层机制有助于写出高并发友好的SQL:

  • 避免长事务:MVCC依赖undo log保留旧版本,长事务导致大量版本堆积、空间膨胀,还可能拖慢purge线程
  • 合理选择隔离级别:RC适合读多写少、允许“不可重复读”的场景;RR能防幻读但锁范围更大,可能引发更多锁等待
  • WHERE条件务必命中索引:否则行锁会退化为表锁或锁住全表索引范围,极大降低并发能力
  • 慎用SELECT ... FOR UPDATE:它强制当前读+加锁,在高并发更新场景易成瓶颈,优先考虑乐观锁或应用层重试

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

热门AI工具

更多
蛙蛙写作

一款AI论文写作工具,主要用于超级AI智能写作助手,适合需要提升相关任务效率的用户。

超级简历WonderCV

一款AI办公效率工具,主要用于免费求职简历模版下载制作,应届生职场人必备简历制作神器,适合需要提升相关任务效率的用户。

豆包大模型

豆包大模型是一款由字节跳动推出的企业级大语言模型服务平台。

PixPix
PixPix Hot

PixPix是一款面向电商视觉生产的AI商品图生成工具。

SkildArt
SkildArt Hot

SkildArt是一款AI文本写作工具,一站式 AI 视觉创作平台。

WorkBuddy

一款AI办公效率工具,主要用于腾讯云推出的AI原生桌面智能体工作台,适合需要提升相关任务效率的用户。

音述AI
音述AI Hot

一款AI音频处理工具,主要用于音述AI是一个以“用声音述说故事”为核心的 AI 音乐创作与声音分享社区,适合需要提升相关任务效率的用户。

Laper
Laper Hot

Laper是专为编剧、导演和制片人推出的 AI 原生剧本创作工具。

DeepSeek

DeepSeek是一款面向对话、写作、编程和推理场景的AI大模型工具。

相关专题

更多
数据分析工具有哪些
数据分析工具有哪些

数据分析工具有Excel、SQL、Python、R、Tableau、Power BI、SAS、SPSS和MATLAB等。详细介绍:1、Excel,具有强大的计算和数据处理功能;2、SQL,可以进行数据查询、过滤、排序、聚合等操作;3、Python,拥有丰富的数据分析库;4、R,拥有丰富的统计分析库和图形库;5、Tableau,提供了直观易用的用户界面等等。

4583

2023.10.12

SQL中distinct的用法
SQL中distinct的用法

SQL中distinct的语法是“SELECT DISTINCT column1, column2,...,FROM table_name;”。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

951

2023.10.27

SQL中months_between使用方法
SQL中months_between使用方法

在SQL中,MONTHS_BETWEEN 是一个常见的函数,用于计算两个日期之间的月份差。想了解更多SQL的相关内容,可以阅读本专题下面的文章。

1209

2024.02.23

SQL出现5120错误解决方法
SQL出现5120错误解决方法

SQL Server错误5120是由于没有足够的权限来访问或操作指定的数据库或文件引起的。想了解更多sql错误的相关内容,可以阅读本专题下面的文章。

6561

2024.03.06

sql procedure语法错误解决方法
sql procedure语法错误解决方法

sql procedure语法错误解决办法:1、仔细检查错误消息;2、检查语法规则;3、检查括号和引号;4、检查变量和参数;5、检查关键字和函数;6、逐步调试;7、参考文档和示例。想了解更多语法错误的相关内容,可以阅读本专题下面的文章。

3323

2024.03.06

oracle数据库运行sql方法
oracle数据库运行sql方法

运行sql步骤包括:打开sql plus工具并连接到数据库。在提示符下输入sql语句。按enter键运行该语句。查看结果,错误消息或退出sql plus。想了解更多oracle数据库的相关内容,可以阅读本专题下面的文章。

6540

2024.04.07

sql中where的含义
sql中where的含义

sql中where子句用于从表中过滤数据,它基于指定条件选择特定的行。想了解更多where的相关内容,可以阅读本专题下面的文章。

8981

2024.04.29

sql中删除表的语句是什么
sql中删除表的语句是什么

sql中用于删除表的语句是drop table。语法为drop table table_name;该语句将永久删除指定表的表和数据。想了解更多sql的相关内容,可以阅读本专题下面的文章。

1210

2024.04.29

Vite 项目如何打包和部署
Vite 项目如何打包和部署

Vite项目打包部署专题汇集生产构建、产物预览、输出目录、资源路径、Nginx与GitHub Pages部署及常见白屏和路由404问题的已审核文章,帮助读者完成上线流程。

20

2026.10.28

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
热门推荐
/
最新课程
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn