尧图网络 高端网站定制 · 原创设计
免费咨询热线
400-888-6620
免费获取方案
PostgreSQL并发控制:MVCC与锁机制详解
1. 并发控制的基本概念与PostgreSQL实现在数据库系统中并发控制是确保多个事务同时执行时数据一致性的关键技术。PostgreSQL作为一款功能强大的开源关系型数据库提供了多种并发控制机制来应对不同的业务场景需求。并发控制主要解决三类问题丢失更新Lost Update两个事务同时读取并修改同一数据后提交的事务会覆盖前一个事务的修改脏读Dirty Read一个事务读取了另一个未提交事务修改的数据不可重复读Non-repeatable Read同一事务内两次读取同一数据得到不同结果PostgreSQL主要采用三种并发控制技术多版本并发控制MVCCPostgreSQL的默认机制乐观锁Optimistic Concurrency Control悲观锁Pessimistic Concurrency Control提示MVCC是PostgreSQL的默认并发控制机制它通过保存数据的多个版本来实现高并发而乐观锁和悲观锁则是在特定场景下的补充方案。2. PostgreSQL中的悲观锁实现悲观锁基于先锁定再修改的原则假设并发冲突经常发生因此在访问数据前先获取锁确保独占访问。PostgreSQL提供了多种悲观锁机制。2.1 行级锁的实现方式PostgreSQL支持以下几种行级锁SELECT * FROM accounts WHERE id 1 FOR UPDATE; -- 排他锁 SELECT * FROM accounts WHERE id 1 FOR SHARE; -- 共享锁 SELECT * FROM accounts WHERE id 1 FOR NO KEY UPDATE; -- 无键更新锁每种锁的适用场景FOR UPDATE当需要修改行数据时使用阻止其他事务获取该行的任何锁FOR SHARE当需要读取但不修改数据时使用允许多个事务同时获取共享锁FOR NO KEY UPDATE类似FOR UPDATE但不锁定外键引用2.2 表级锁的类型与使用PostgreSQL还提供了表级锁适用于批量操作LOCK TABLE accounts IN ACCESS EXCLUSIVE MODE; -- 最严格的锁模式 LOCK TABLE accounts IN SHARE MODE; -- 共享锁模式常见的表级锁模式对比锁模式冲突锁适用场景ACCESS SHAREACCESS EXCLUSIVESELECT语句自动获取ROW SHAREEXCLUSIVE, ACCESS EXCLUSIVESELECT FOR UPDATE/SHAREROW EXCLUSIVESHARE, SHARE ROW EXCLUSIVE, EXCLUSIVE, ACCESS EXCLUSIVEUPDATE/DELETE/INSERTSHARE UPDATE EXCLUSIVESHARE UPDATE EXCLUSIVE, SHARE, SHARE ROW EXCLUSIVE, EXCLUSIVE, ACCESS EXCLUSIVEVACUUM, CREATE INDEX CONCURRENTLYSHAREROW EXCLUSIVE, SHARE UPDATE EXCLUSIVE, SHARE ROW EXCLUSIVE, EXCLUSIVE, ACCESS EXCLUSIVECREATE INDEXSHARE ROW EXCLUSIVEROW EXCLUSIVE, SHARE UPDATE EXCLUSIVE, SHARE, SHARE ROW EXCLUSIVE, EXCLUSIVE, ACCESS EXCLUSIVEPostgreSQL内部使用EXCLUSIVEROW SHARE, ROW EXCLUSIVE, SHARE UPDATE EXCLUSIVE, SHARE, SHARE ROW EXCLUSIVE, EXCLUSIVE, ACCESS EXCLUSIVEPostgreSQL内部使用ACCESS EXCLUSIVE所有模式DROP TABLE, TRUNCATE, ALTER TABLE2.3 死锁检测与处理PostgreSQL有内置的死锁检测机制当检测到死锁时会自动中止其中一个事务。可以通过以下方式减少死锁发生按照固定顺序访问表和行缩短事务持续时间使用较低的隔离级别设置合理的锁超时SET deadlock_timeout 1s; -- 设置死锁检测间隔 SET lock_timeout 3s; -- 设置锁等待超时3. PostgreSQL中的乐观锁实现乐观锁基于先修改再验证的原则假设并发冲突很少发生只在提交时检查是否有冲突。PostgreSQL没有内置的乐观锁实现但可以通过以下模式自行实现。3.1 版本号模式实现最常见的乐观锁实现方式是为表添加版本号字段ALTER TABLE products ADD COLUMN version INTEGER DEFAULT 1; -- 更新时检查版本号 UPDATE products SET name New Name, version version 1 WHERE id 1 AND version 1;如果更新行数为0表示版本号不匹配发生了并发修改。3.2 时间戳模式实现使用时间戳作为乐观锁的另一种实现方式ALTER TABLE products ADD COLUMN last_updated TIMESTAMP DEFAULT CURRENT_TIMESTAMP; -- 更新时检查时间戳 UPDATE products SET name New Name, last_updated CURRENT_TIMESTAMP WHERE id 1 AND last_updated 2023-01-01 10:00:00;3.3 条件更新模式PostgreSQL的UPDATE语句可以直接使用条件判断UPDATE accounts SET balance balance - 100 WHERE id 1 AND balance 100;这种模式不需要额外字段直接使用业务字段作为乐观锁条件。4. MVCC与锁机制的协同工作PostgreSQL的MVCC(多版本并发控制)是其并发控制的核心机制与锁机制协同工作。4.1 MVCC基本原理MVCC通过以下方式实现每个事务有唯一的事务ID(XID)每行数据有xmin(创建该行的事务ID)和xmax(删除/过期该行的事务ID)事务只能看到xmin小于等于当前事务ID且xmax为空或大于当前事务ID的行-- 查看行的xmin和xmax SELECT xmin, xmax, * FROM accounts WHERE id 1;4.2 MVCC与锁的关系虽然MVCC可以减少锁的使用但在某些情况下仍需锁机制显式使用SELECT FOR UPDATE/SHARE某些DDL操作需要表锁序列化隔离级别下的谓词锁4.3 事务隔离级别的影响PostgreSQL支持四种隔离级别读未提交(实际实现为读已提交)读已提交(默认级别)可重复读序列化不同隔离级别下锁的行为有所不同读已提交每条语句看到的是语句开始时的快照可重复读事务看到的是事务开始时的快照序列化使用谓词锁防止幻读5. 实战中的锁选择与优化在实际应用中如何选择合适的并发控制策略是关键。5.1 乐观锁与悲观锁的选择标准乐观锁适用场景读多写少冲突概率低需要高吞吐量业务逻辑可以处理冲突重试悲观锁适用场景写多读少冲突概率高需要确保操作成功无法接受重试开销5.2 常见性能问题与解决方案锁等待超时优化事务设计减少持有锁的时间考虑使用乐观锁替代调整lock_timeout参数死锁频繁确保按固定顺序访问表和行减少事务中的操作数量使用较低的隔离级别锁升级导致性能下降避免大批量更新分批处理大数据量操作考虑使用表锁替代大量行锁5.3 监控与诊断锁问题PostgreSQL提供多种锁监控视图-- 查看当前锁情况 SELECT * FROM pg_locks; -- 查看锁等待关系 SELECT blocked_locks.pid AS blocked_pid, blocking_locks.pid AS blocking_pid FROM pg_catalog.pg_locks blocked_locks JOIN pg_catalog.pg_locks blocking_locks ON blocking_locks.locktype blocked_locks.locktype AND blocking_locks.DATABASE IS NOT DISTINCT FROM blocked_locks.DATABASE AND blocking_locks.relation IS NOT DISTINCT FROM blocked_locks.relation AND blocking_locks.page IS NOT DISTINCT FROM blocked_locks.page AND blocking_locks.tuple IS NOT DISTINCT FROM blocked_locks.tuple AND blocking_locks.virtualxid IS NOT DISTINCT FROM blocked_locks.virtualxid AND blocking_locks.transactionid IS NOT DISTINCT FROM blocked_locks.transactionid AND blocking_locks.classid IS NOT DISTINCT FROM blocked_locks.classid AND blocking_locks.objid IS NOT DISTINCT FROM blocked_locks.objid AND blocking_locks.objsubid IS NOT DISTINCT FROM blocked_locks.objsubid AND blocking_locks.pid ! blocked_locks.pid AND blocked_locks.granted false;6. 高级应用场景与案例分析6.1 分布式系统中的锁实现在分布式系统中PostgreSQL的锁机制可以扩展使用使用咨询锁(advisory lock)实现分布式锁-- 获取应用级锁 SELECT pg_advisory_xact_lock(12345); -- 检查锁是否可用 SELECT pg_try_advisory_xact_lock(12345);结合Redis等外部系统实现分布式锁6.2 长事务处理策略对于需要长时间运行的事务考虑拆分为多个短事务使用SAVEPOINT实现部分回滚在适当位置释放锁BEGIN; -- 获取必要资源 SELECT * FROM resources WHERE id 1 FOR UPDATE; -- 长时间处理... -- 定期释放锁并重新获取 COMMIT; BEGIN; SELECT * FROM resources WHERE id 1 FOR UPDATE;6.3 批量操作优化大批量数据操作时的锁优化使用COPY替代INSERT减少锁开销分批提交事务在低峰期执行批量操作-- 分批更新示例 DO $$ DECLARE batch_size INT : 1000; max_id INT; min_id INT : 0; BEGIN SELECT MAX(id) INTO max_id FROM large_table; WHILE min_id max_id LOOP BEGIN UPDATE large_table SET status processed WHERE id min_id AND id min_id batch_size; min_id : min_id batch_size; EXCEPTION WHEN OTHERS THEN -- 错误处理 END; END LOOP; END $$;在实际项目中我经常遇到开发者在处理并发时过度使用悲观锁的情况这会导致系统吞吐量下降。一个经验法则是只有在明确知道会发生冲突且冲突处理成本高于锁开销时才使用悲观锁。对于大多数业务场景PostgreSQL的MVCC配合适当的乐观锁策略往往能提供更好的性能表现。
RELATED

相关推荐

搜索引擎高级检索的底层逻辑与六大全能语法

搜索引擎高级检索的底层逻辑与六大全能语法

1. 这不是“搜索技巧”,而是信息筛选的底层逻辑重构很多人把“高级搜索语法”当成玄学口诀来背:site:、intitle:、filetype:这些符号像咒语一样被反复默念,却始终卡在“搜到了但不是我要的”这个死循环里。我带过不少刚接触信息检索的某高校学…

📅 2026/10/31 8:02:49
DirectDraw老源码迁移实战:从编译到双缓冲游戏循环

DirectDraw老源码迁移实战:从编译到双缓冲游戏循环

简介:这份资源是《Windows游戏编程大师技巧(第二版)》配套光盘源码的完整打包,面向有一定C基础、希望系统学习Windows平台游戏开发的中高级读者,可用于对照书中章节动手复现示例、理解底层实现思路。压缩包共收录1035个…

📅 2026/10/31 8:02:49
ICU4C 54.1 源码包实战:从编译集成到裁剪优化

ICU4C 54.1 源码包实战:从编译集成到裁剪优化

简介:这份资源是 ICU4C 54.1 版本的完整 C 源码包,面向需要在 Windows 平台使用 Visual C 编译国际化与 Unicode 支持库的开发者,尤其适合从事跨语言、跨区域应用开发的中高级 C 工程师。压缩包共 4519 个文件,约 25.7MB&#xff…

📅 2026/10/31 7:57:49
MORE NEWS

更多资讯

📰

GE90发动机声学建模:低频噪声、三重静子与实时音频合成

1. 为什么GE90的“声音”比推力数据更难复现? 很多人第一次听到GE90发动机在地面试车时的轰鸣,第一反应不是“这推力真猛”,而是“这低频震得胸腔发麻,耳朵里像塞了团湿棉花”。我参与过三个不同层级的航空声学模拟项目&#xff0…

📰

26面31模板:构建高效技术知识管理体系的实践指南

1. 项目背景与核心价值 "26面主课31笔记"这个看似简单的标题背后,隐藏着一个系统化的知识管理方法论。作为一名持续输出技术内容十年的创作者,我深刻理解结构化笔记对知识沉淀的重要性。这个数字组合实际上代表了一种高效的内容组织方式——通…

📰

26面主课31笔记:高效知识管理系统解析

1. 项目概述:26面主课31笔记的深度解析 "26面主课31笔记"这个看似简单的标题背后,隐藏着一个系统化的知识管理方法论。作为一名长期从事知识管理和效率提升研究的实践者,我将从多个维度拆解这个高效学习系统的核心要素。 这个系统…

📰

OpenClaw与Nanobot:AI Agent架构设计哲学对比

1. 项目概述:OpenClaw与Nanobot的设计哲学之争 在2026年的AI Agent领域,OpenClaw和Nanobot代表了两种截然不同的设计路线。前者是功能全面的"重型武器",后者则是遵循Unix哲学的极简工具。这种差异不仅体现在代码体积上,…

📰

车载5G与LTE技术对比及智能切换策略解析

1. 车载5G与LTE的博弈现状 第一次在高速公路上用5G车载娱乐系统看4K视频时,我就被突然切换成LTE网络时缓冲转圈圈的画面惊到了。作为从业十年的车联网工程师,我完全理解这种设计背后的技术逻辑——这不是运营商偷工减料,而是车载通信领域特有…

📰

自动驾驶算法核心技术解析与实践指南

1. 自动驾驶算法概述 自动驾驶算法是让汽车具备环境感知、决策规划和车辆控制能力的核心技术体系。简单来说,它就像给汽车装上了"大脑"和"眼睛",让车辆能够自己"看路"、"思考"和"开车"。这个领域近年…

TODAY

今日更新

THIS WEEK

本周精选

THIS MONTH

本月热门

读完文章,想聊聊您的网站?

告诉我们您的行业与需求,资深顾问一对一梳理方案与报价,全程免费。

📞 💬