当前位置: 首页 > news >正文

行锁(Row Locking)和MVCC(多版本并发控制)

在数据库系统中,**行锁(Row Locking)MVCC(多版本并发控制)**是两种不同的并发控制机制,它们的使用场景和原理有显著区别。以下是详细对比和适用场景分析:


一、行锁(Row Locking)

1. 核心原理
  • 阻塞式并发控制:通过加锁(共享锁、排他锁)直接阻止其他事务访问被锁定的数据。
  • 锁粒度:锁定单行或多行数据(如 SELECT ... FOR UPDATE)。
2. 典型使用场景
场景说明示例
高竞争写操作多个事务同时修改同一行数据电商库存扣减:
UPDATE products SET stock=stock-1 WHERE id=100
显式锁定读取需要确保后续操作基于最新数据银行转账前锁定账户:
SELECT balance FROM accounts WHERE id=1 FOR UPDATE
避免丢失更新防止两个事务覆盖彼此的修改并发更新用户积分:
事务A和B同时执行 UPDATE users SET points=points+10 WHERE id=5
悲观并发控制默认认为冲突会发生,提前加锁传统OLTP系统(如早期MySQL InnoDB默认模式)
3. 优缺点
  • 优点:保证强一致性,避免脏写和丢失更新。
  • 缺点:可能引发锁等待甚至死锁,降低并发性能。

二、MVCC(Multi-Version Concurrency Control)

1. 核心原理
  • 非阻塞式并发控制:每个事务看到的是数据在某个时间点的快照(通过版本链实现)。
  • 读不阻塞写,写不阻塞读:读写操作不会相互阻塞(但写-写仍需锁)。
2. 典型使用场景
场景说明示例
高并发读操作读多写少的系统(如论坛、CMS)查询文章内容:
SELECT * FROM articles WHERE id=123(无锁)
长事务查询需要一致性视图,避免被其他事务干扰生成报表时保持数据一致性
降低锁冲突避免读操作阻塞写操作用户浏览商品详情页时,后台仍可更新库存
乐观并发控制默认认为冲突较少,提交时检查版本分布式系统(如PostgreSQL、MySQL InnoDB的默认读已提交/可重复读隔离级别)
3. 优缺点
  • 优点:大幅提升读并发性能,避免读-写阻塞。
  • 缺点:需要维护版本链,存储开销较大;写冲突需在提交时检测(可能引发回滚)。

三、行锁 vs MVCC 对比总结

特性行锁MVCC
并发控制方式悲观锁(先加锁)乐观锁(版本检查)
读写关系读-写、写-写互斥读-写不互斥(写-写仍需锁)
一致性视图实时最新数据事务开始时或语句开始时的快照
适用场景高竞争写操作高并发读操作
典型数据库MySQL InnoDB(显式锁时)PostgreSQL、MySQL InnoDB(默认)、Oracle

四、混合使用场景

现代数据库(如MySQL InnoDB)通常结合两者

  1. MVCC处理读操作:普通SELECT使用快照读(无锁)。
  2. 行锁处理写操作UPDATE/DELETE默认加排他锁,SELECT ... FOR UPDATE加显式锁。
  3. 冲突处理
    • 写操作会检查数据的最新版本,若被其他事务修改则可能阻塞或回滚(取决于隔离级别)。

五、隔离级别的影响

隔离级别行锁使用MVCC使用
READ UNCOMMITTED写操作加锁无快照,读可能脏读
READ COMMITTED写操作加锁语句级快照
REPEATABLE READ写操作加锁事务级快照(MySQL默认)
SERIALIZABLE所有读操作加共享锁退化为类似行锁的严格串行

六、开发建议

  1. 优先让数据库自动管理
    • 大多数情况下,依赖数据库的默认机制(如InnoDB的MVCC+行锁)即可。
  2. 显式控制场景
    • 需要强一致性时手动加锁(FOR UPDATE)。
    • 读多写少时利用MVCC避免锁竞争。
  3. 监控与调优
    • 高并发系统需关注锁等待(SHOW ENGINE INNODB STATUS)和长事务(可能延长MVCC版本链)。

相关文章:

  • 空地机器人在复杂动态环境下,如何高效自主导航?
  • ABAP:ME22N控制是否可修改-物料
  • 新晋前端框架技术:小程序容器与SuperApp构建
  • 多模态大语言模型arxiv论文略读(十九)
  • 用 Python 从零构建异步回显服务器
  • OceanBase4.0社区版 单机快速部署
  • clickhosue中json字符串转为表
  • JavaScript UI 组件DHTMLX:如何进行集成 DHTMLX 预订和调度程序的前端设置
  • 六、文件操作
  • MYSQL MVCC详解
  • Python 二分查找(bisect):排序数据的高效检索
  • 四层 PCB 在工业控制设备中的叠层设计要点
  • React 把一系列 state 更新加入队列
  • 如何看电脑的具体配置?
  • 网络7 配置网卡 路由表
  • 深入解析UML图:版本演变、静态图与动态图详解
  • ctfshow做题笔记—栈溢出—pwn75~pwn79
  • 手动关闭ArcGIS与ArcGIS Online连接的方法
  • 基于Python的​​LSTM、CNN中文情感分析系统
  • 【Python爬虫】简单案例介绍1
  • 韩国一战机飞行训练中掉落机炮吊舱和空油箱
  • 从6家试点扩展至全行业,券商并表监管有何看点?
  • 鲁比奥称“美或退出俄乌谈判”,欧洲官员:为了施压乌克兰
  • 人民文学奖颁出,董宇辉获传播贡献奖
  • 由“环滁皆山”到“环滁皆景”,滁州如何勾勒“文旅复兴”
  • 新疆维吾尔自治区政协原副主席窦万贵一审被控受贿超2.29亿