PostgreSQL中所的锁
为了确保复杂的事务可以安全地同时运行,PostgreSQL提供了各种级别的锁来控制对各种数据对象的并发访问,使得对数据库关键部分的更改序列化。事务并发运行,直到它们尝试获取互相冲突的锁为止(比如两个事务更新同一行时)。当多个事务同时在数据库中运行时,并发控制是一种用于维持一致性和隔离性的技术,在PostgreSQL中,使用快照隔离Sanpshot Isolation (简称SI) 来实现多版本并发控制,同时以两阶段锁定 (2PL) 机制为辅。在执行DDL时使用2PL,在执行DML时使用SI
在PostgreSQL中,最主要的是表级锁与行级锁,此外还有页锁、咨询锁
常用概念
系统锁与事务锁
原子操作:PostgreSQL为了支持无锁编程,提供了系列的原则操作,包括内存屏障,CAS(Compare And Swap),TAS(Test And Set)等
自旋锁(Spin lock):是一种和硬件结合的互斥锁,它借用了硬件提供的原子操作原语来对一些共享变量进行封锁,通常适用于临界区比较小的情况
轻量锁(Lightweight lock):PostgreSQL中进程需要对共享内存进行频繁的读写操作,轻量锁主要是保护这些共享内存中的数据结构。它是一种读写锁,有共享和排它两种模式
常规锁(Regular lock):对数据库对象加锁,PostgreSQL两阶段锁就是借助常规锁实现的。根据封锁对象的不同,他有分成了不同粒度,如对表、页面、元祖、事务ID等分别加锁。已最常见的表锁为例,当不同的事务操作一个表时,会尝试通过表的Oid来构造LockTag,这样每个数据库对象都会有一个唯一标识,然后根据这个唯一的标识到锁表中申请锁。postgreSQL数据库将常规锁分层了8个不同的等级,不同的操作需要使用不同等级的常规锁。

常规锁的级别
| 锁模式 | 说明 |
|---|---|
| AccessShareLock(1) | 当对一个对象进行查询(select)操作,会申请该类型的锁,该锁是最低级别的锁,相当于读写锁中的共享锁 |
| RowShareLock(2) | 当查询指定FOR UPDATE/SHARE时,会申请该类型的锁 |
| RowExclusiveLock(3) | 当对数据对象做增删改操作是,会申请该类型的锁,INSERT、DELETE、UPDATE |
| ShareUpdateExclusiveLock(4) | VACUUM(non-FULL)、ANALYZE、CREATE INDEX CONCURRENTLY, ALTER TABLE |
| ShareLock(5) | 主要用于创建索引时申请该类型的锁, CREATE INDEX |
| ShareRowExclusiveLock(6) | 和ExclusiveLock相似,但和RowShareLock兼容。 CREATE TRIGGER, ALTER TABLE |
| ExclusiveLock(7) | 和AccessExClusiveLock类似,但和最低级别的读锁AccessShareLock兼容 |
| AccessExclusiveLock(8) | 在对元数据(系统表)做DDL操作时,会申请该类型的锁,AccessExclusiveLock与其他所有的锁模式都不相容 DROP,TRUNCATE,VACUUM FULL, LOCK TABLE |

两阶段锁
对象锁
对象锁是在共享内存中的,受到两个参数值的限制:max_locks_per_transaction×max_connections
对象锁可以通过pg_locks这个视图来查询
SELECT
l.pid,
a.datname AS database,
c.relname AS table,
l.mode AS lock_mode,
l.granted AS granted,
a.usename AS username,
a.query AS query
FROM
pg_locks l
JOIN
pg_stat_activity a ON l.pid = a.pid
JOIN
pg_class c ON l.relation = c.oid
如果资源已经锁定在不兼容的模式中,那么试图获取锁的事务将排队等待,直到释放锁。等待事务不消耗处理器资源:涉及的后端进程«休眠»,当资源空闲时被操作系统唤醒
对象类型
- relation
- transactionid/virtualxid
- tuple
- extend
- object
- page
- advisory
对象级别的锁

行锁
行锁是如何实现的?
问题:
HeapTupleSatisfiesMVCC中的HEAP_IS_LOCKED是干什么的?
为什么HEAP_IS_LOCKED就返回true?
调用栈:
- HEAP_XMAX_SHARED_LOCK
- HEAP_XMAX_EXCL_LOCK
- heap_lock_tuple
- ExecLockRows
heap_lock_tuple的逻辑:
- HeapTupleSatisfiesUpdate:
HeapTupleBeingUpdated:已插入,正在被修改,还没有提交。
多个事务在lock元组,而且至少有一个在运行
仅仅有一个事务在修改元组,但还没有提交 - 拿锁,修改pg_multixact, 修改flag, 放锁
tuple锁
PostgreSQL中的行锁

转载文章:PostgreSQL中所的锁 - 知乎
相关文章:
PostgreSQL中所的锁
为了确保复杂的事务可以安全地同时运行,PostgreSQL提供了各种级别的锁来控制对各种数据对象的并发访问,使得对数据库关键部分的更改序列化。事务并发运行,直到它们尝试获取互相冲突的锁为止(比如两个事务更新同一行时)。当多个事务同时在数据…...
学习MySQL先有全局观,细说其发展历程及特点
学习MySQL先有全局观,细说其发展历程及特点 一、枝繁叶茂的MySQL家族1. 发展历程2. 分支版本 二、特点分析1. 常用数据库2. 选型角度及场景 三、三大组成部分四、总结 相信很多同学在接触编程之初,就接触过数据库,而对于其中关系型数据库中的…...
Linux安装与配置Maven
案例中Linux版本为CentOS7.9,安装目录为 /root/software/ 1、使用 wget 命令从官网下载安装包(https://maven.apache.org/download.cgi) wget https://dlcdn.apache.org/maven/maven-3/3.9.5/binaries/apache-maven-3.9.5-bin.tar.gz2、解压…...
Java面向对象第一天
什么是类?什么是对象? 现实生活是由很多很多对象组成的,基于对象抽出了类 对象:软件中真实存在的单个的个体/东西 类:类型/类别,代表一类个体 类是对象的模板/模子,对象是类的具体的实例 类中…...
什么是mvc原理是什么
MVC是一种设计模式,它将应用程序分为三个部分:模型(Model)、视图(View)和控制器(Controller)。 模型(Model)表示应用程序的数据结构,包括与数据相…...
json_to_mask
修改后的json_to_dataset文件,直接复制替换你自己原始的json_to_dataset,建议保存一下原版import argparse import base64 import json import os import os.path as ospimport imgviz import PIL.Imagefrom labelme.logger import logger from labelme …...
Camtasia2024免费版mac电脑录屏软件
作为一个互联网人,没少在录屏软件这个坑里摸爬滚打。培训、学习、游戏、影视解说……都得用它。这时候没个拿得出手的私藏软件,还怎么混?说实话,录屏软件这两年也用了不少,基本功能是有但总觉得缺点什么,直…...
拦截器的使用
拦截器(Interceptor)是一种在应用程序中用于干预、修改或拦截请求和响应的组件,是AOP 编程的一种实践,和过滤器一样都是一种具体的AOP实现。它可以在请求被发送到目标处理程序之前或之后,对请求进行预处理或对响应进行…...
R语言——taxize(第四部分)
taxize(第四部分) 3.39. get_wiki(获取维基分类群的页面名称)3.40. get_wormsid(获取分类群名称的Worms ID)3.41. gni_details(使用Global Names Index搜索分类学名称详情)3.42. gni…...
C++学习 --list
目录 1, 什么是list 2, 创建 2-1, 标准数据类型 2-2, 自定义数据类型 2-3, 其他创建方式 3, 操作list 3-1, 赋值 3-2, 添加元素 3-2-1, 添加元素(assign) 3-2-…...
Springboot集成swagger之knife4j
knife4j的最终效果: 支持直观的入参介绍、在线调试及离线各种API文档下载。 1 引入pom <dependency><groupId>com.github.xiaoymin</groupId><artifactId>knife4j-spring-boot-starter</artifactId><version>3.0.2</ver…...
多线程 02
1.线程的常见构造方法 方法说明Thread()创建线程对象Thread(Runnable target)使用 Runnable 对象创建线程对象Thread(String name)创建线程对象,并命名Thread(Runnable target, String name)使用 Runnable 对象创建线程对象,并命名【了解】Thread(Threa…...
车辆管控大数据可视化平台案例源码分析【可视化项目案例-10】
🎉🎊🎉 你的技术旅程将在这里启航! 🚀🚀 本专栏包括但不限于大屏可视化、图表可视化等等。订阅专栏用户在文章底部可下载对应案例源码以供大家深入的学习研究。 🎓 每一个案例都会提供完整代码和详细的讲解,不论你是初学者还是资深开发者,这里都有适合你的内容。…...
链表的回文结构
题目描述 题目链接:链表的回文结构_牛客题霸_牛客网 (nowcoder.com) 题目分析 我们的思路是: 找到中间结点逆置后半段比对 我们可以简单画个图来表示一下: ‘ 奇数和偶数都是可以的 找中间结点 我们可以用快慢指针来找中:l…...
CSS特效017:球体涨水的效果
CSS常用示例100专栏目录 本专栏记录的是经常使用的CSS示例与技巧,主要包含CSS布局,CSS特效,CSS花边信息三部分内容。其中CSS布局主要是列出一些常用的CSS布局信息点,CSS特效主要是一些动画示例,CSS花边是描述了一些CSS…...
Windows下安装Anaconda3并使用JupyterNoteBook
下载安装包 Anaconda官网 进官网,点击下载 自动根据当前系统下载对应的包了,安装包大约1G,喝杯Java耐心等待。 安装 很多人安装C盘,我这里放D盘。 注意:你的文件夹目录一定要不能有空格 然后其他的直接默认install即…...
什么年代了,还不会 CI/CD 么?
目录 什么是 CI/CD? CI/CD 对业务有哪些好处? 一:确保卓越的代码质量 二:更快的发布速度 → 更快的交付 三:自动化降低成本 四:故障隔离 五:简化回滚 六:持续反馈 七&#…...
centos 7.7 安装Python-3.7.4
一、安装PYTHON 编译依赖包 1.1 首先安装gcc编译器,gcc有些系统版本已经默认安装,通过 gcc --version 查看,没安装的先安装gcc, yum -y install gcc glibc make1.2 安装其它依赖包,(注:不要缺…...
git的用法
目录 一、为什么需要git 二、git基本操作 2.1、初始化git仓库 2.2、配置本地仓库的name和email 2.3、认识工作区、暂存区、版本库 三、git的实际操作 3.1 提交文件 3.2 查看git状态以及具体的修改 3.3 git版本回退 git reset 3.1 撤销修改 四、git分支管理 4.…...
管道在Vue和Angular中的作用及React的替代方案
管道在Vue和Angular中的作用及React的替代方案 前言管道起源管道特点 前端中管道概念和作用概念作用 React关于管道的替代方案Vue和Angular管道的区别 前言 本文主要讲解管道在Vue和Angular中有哪些作用以及React对于管道概念的替代方案是什么。 管道起源 计算机中的Pipline…...
反向传播算法调优:提升神经网络训练效率的关键技巧
1. 反向传播算法调优的核心价值反向传播作为神经网络训练的基石算法,其配置质量直接影响模型收敛速度和最终性能。在实际工程中,我们常遇到模型训练不稳定、收敛缓慢或陷入局部最优等问题,这些问题90%以上可以通过调整反向传播参数解决。不同…...
RWKV7-1.5B-world保姆级教程:从平台镜像市场部署→WEB入口访问→参数调优全链路
RWKV7-1.5B-world保姆级教程:从平台镜像市场部署→WEB入口访问→参数调优全链路 1. 引言:认识RWKV7-1.5B-world RWKV7-1.5B-world是基于第7代RWKV架构的轻量级双语对话模型,拥有15亿参数。与传统的Transformer架构不同,它采用创…...
伏羲模型与Dify结合:构建零代码气象分析与预报工作流
伏羲模型与Dify结合:构建零代码气象分析与预报工作流 最近在做一个气象相关的项目,团队里既有懂技术的工程师,也有专注于业务分析的同事。工程师们用代码调用模型接口很顺手,但业务同事每次想分析点数据、生成个报告,…...
Dantotsu常见问题解答:解决登录失败、下载错误与性能优化技巧
Dantotsu常见问题解答:解决登录失败、下载错误与性能优化技巧 【免费下载链接】Dantotsu Anilist client based on Saikou 项目地址: https://gitcode.com/gh_mirrors/da/Dantotsu Dantotsu是一款基于Saikou的Anilist客户端,为动漫爱好者提供便捷…...
PPTAgent智能体框架:基于反思机制的自动化PPT生成技术解析
1. PPTAgent:一个能“思考”的PPT生成智能体框架深度解析做PPT这件事,估计是很多职场人、学生和研究人员的“痛点”。从构思大纲、搜集资料、撰写内容,到排版设计、寻找配图,一套流程下来,少则几小时,多则一…...
OpenCore Legacy Patcher终极指南:3步让老旧Mac重获新生
OpenCore Legacy Patcher终极指南:3步让老旧Mac重获新生 【免费下载链接】OpenCore-Legacy-Patcher Experience macOS just like before 项目地址: https://gitcode.com/GitHub_Trending/op/OpenCore-Legacy-Patcher 你是否拥有一台被苹果官方"抛弃&quo…...
【限时公开】微软内部未文档化的 devcontainer.json 隐藏字段:3个 undocumented 属性让构建速度飙升2.8倍
更多请点击: https://intelliparadigm.com 第一章:Dev Containers 优化避坑指南:从原理到实践的全景认知 Dev Containers 并非简单的容器镜像封装,而是 VS Code 与 Docker 生态深度协同的开发环境抽象层。其核心在于 devcontaine…...
5步掌握Arcade-plus:打造专业Arcaea谱面的终极指南
5步掌握Arcade-plus:打造专业Arcaea谱面的终极指南 【免费下载链接】Arcade-plus A better utility used to edit and preview aff files 项目地址: https://gitcode.com/gh_mirrors/ar/Arcade-plus 你是否想过亲手制作令人惊艳的Arcaea音乐游戏谱面…...
手把手教你搞定PC网站支付宝扫码登录:从申请到上线的完整避坑指南
支付宝扫码登录全流程实战:从开发配置到异常处理 在PC端网站集成支付宝扫码登录功能,已经成为许多企业提升用户体验的重要选择。相比传统的账号密码登录方式,扫码登录不仅减少了用户记忆成本,还大幅提升了登录流程的安全性和便捷性…...
Skybridge:基于React与TypeScript的AI嵌入式应用全栈框架
1. 从零到一:为什么我们需要 Skybridge?如果你最近在捣鼓 ChatGPT 的 Apps SDK 或者 Model Context Protocol(MCP),想给大模型对话里塞点交互式 UI,那你大概率已经体验过那种“原始”的开发手感了。官方 SD…...
