PostgreSQL如何查看事务所占有的锁?

news2024/12/26 23:23:12

表级锁命令LOCK TABLE

在PG中,显式地在表上加锁的命令为“LOCK TABLE”,此命令的语法如下:

LOCK [TABLE] [ONLY] name [,...][IN lockmode MODE] [NOWAIT]

语法中各项参数说明如下:

  1. name:表名
  2. lockmode:表级锁模式,即SHARE、EXCLUSIVE、ACCESS SHARE、ACCESS EXCLUSIVE、ROW SHARE、ROW EXCLUSIVE、SHARE UPDATE EXCLUSIVE、SHARE ROW EXCLUSIVE
  3. NOWAIT:如果没有NOWAIT这个关键字,当无法获得锁时会一直等待,而如果加了NOWAIT关键字,在无法立即获取该锁时,此命令会立即退出并且报错

在PG中,事务自己的锁是从不冲突的,因此一个事务可以在持有SHARE模式的锁时再请求ROW EXCLUSIVE锁,而不会出现自己的锁阻塞自己的情况

当事务要更新表中的数据时,应该申请ROW EXCLUSIVE锁,而不应该申请SHARE锁,因为在更新数据时,事务还是会对表加ROW EXCLUSIVE锁,想象一下,在两个并发的事务都请求SHARE锁后,开始更新数据前要对表加ROW EXCLUSIVE锁,但由于各自先前已加了SHARE锁,所以都要等待对方释放SHARE锁,因而出现死锁。从这个示例可以看出,如果涉及多种锁模式,那么事务应该总是最先请求最严格的锁模式,否则就容易出现死锁

行级锁命令

显式的行级锁命令是由SELECT命令后加如下子句来构成的:

SELECT ... FOR {UPDATE | SHARE} [OF table_name [,...]] [NOWAIT] [...]
  • NOWAIT关键字加上,如果无法获得锁则直接报错,而不会一直等待。
  • OF table_name明确指定表名字,那么只有被指定的表会被锁定,其他在SELECT中使用的表则不会
  • 不带OF table_name的FOR UPDATE或者FOR SHARE子句将锁定该命令中使用的所有表
  • 如果FOR UPDATE或者FOR SHARE应用于一个视图或者子查询,那么它将同样锁定该视图或者子查询中使用到的所有表
  • 主查询中引用了WITH查询时,WITH查询中的表并不会被锁定
  • 如果想要锁定WITH查询内的表行,需要在WITH查询内指定FOR UPDATE或者FOR SHARE关键字

锁的查看

我们经常需要查看一个事务产生了哪些锁,哪个事务被哪个事务阻塞了,若执行一条SQL语句时阻塞住了,需要查询为什么阻塞,是谁阻塞住的,这些信息可以通过查询系统视图“pg_locks”来得到。pg_locks视图中各列的描述如下:

列名称列类型引用描述
locktypetext被锁定的对象类型:relation、extend、page、tuple、transactionid、virtualxid、object、userlock、advisory
databaseoidpg_database.oid锁定对象的数据库OID,如果对象是一个共享对象,不属于任何数据库,此值为“0”,如果对象是“transaction ID”,此值为空
relationoidpg_class.oid如果对象不是表或只是表的一部分,则此值为“NULL”,否则此值是表的OID
pageinteger表中的页号,如果对象不是表行(tuple)或表页(relation page),则此值为“NULL”
tuplesmallint页内的行号(tuple)
virtualxidtext虚拟事务id
transactionidxid事务id
classidoidpg_class.oid包含该对象系统目录的id
objidoidany OID column对象在系统目录的oid
objsubidsmallint如果对象是表列(table column),此列的值为列号,这时classid和objid指向表
virtualtransactiontext持有或等待这把锁的虚拟事务id
pidinteger持有或等待这把锁的服务进程的PID,如果此锁是被一个两阶段提交的事务持有,则此值为NULL
modetext锁的模式名称,如“ACCESS SHARE”“SHARE”“EXCLUSIVE”等锁模式
grantedboolean如果锁已被持有,此值为True,如果等待获得此锁,则此值为False

上述中,描述事务id的字段有三个:

  • virtualxid
  • transactionid
  • virtualtransaction
  1. transactionid代表事务id,简写为“xid”
  2. virtualxid代表虚拟事务id,简写为“vxid”
  3. 每产生一个事务id,都会在pg_clog下的commit log文件中占用2bit
  4. 最早pg中本没有虚拟事务id,但是后来发现,有一些事务根本没有产生任何实质的变更,如一个只读事务或一个空事务,若在这种情况下也分配一个事务id会造成浪费,于是提出了虚拟事务id的概念
  5. 对于这类只读事务,值分配一个虚拟事务id,而不是实际分配一个真实的事务id,这样就不需要在commit log中占用2bit的空间了

pg_locks这张视图的字段分为以下两部分:

  • virtualtransaction之前的字段(不包括virtualtransaction字段),我们称其为“第一部分”,用于描述锁定对象(Locked Object)信息
  • virtualtransaction之后的字段(包括virtualtransaction字段),我们称其为“第二部分”,用于描述持有锁或等待锁的session信息

了解上述概念后,可以容易理解virtualxid和virtualtransaction两个字段的意思:

  • virtualxid在第一部分字段中,表示锁对象是一个virtualxid
  • virtualtransaction表示持有锁或等待锁session的虚拟事务id

表锁实操

1.先开一个psql窗口,命令如下
image

第一个窗口,查询PID,并锁定一张表。

2.第二个窗口中查看数据库中的锁的情况
image
sql命令:

select locktype,relation::regclass as rel,virtualxid as vxid,transactionid as xid,virtualtransaction as vxid2,pid,mode,granted from pg_locks where pid = 12264;

通过上述图片可以看出:

  • 第一行显示的是事务在自己的“virtualxid”上加的ExclusiveLock锁,这是必定会加上的
  • 第二行才是我们实际在表上加的锁“AccessExclusiveLock”

3.新增一个窗口,显示地对表加锁
image

执行sql语句发现,该窗口的锁表语句会被阻塞住

4.查看两个进程的锁情况
image

  • 发现两个进程都对表加了锁
  • 进程12264中的granted字段为t,说明它获得了这把锁
  • 进程21052中的granted字段为f,说明该进程没有获得这把锁,从而被阻塞

行锁实操

1.第一个窗口执行如下操作(在加表锁的基础上加行锁)
image

2.第二个窗口中查看数据库中的锁的情况
image

行锁不仅会在表上加意向锁,也会在相应的主键上加意向锁。其中“jxx_test_pkey”就是表的主键。

3.另一个窗口加行锁
image
该窗口阻塞

4.第二个窗口中查看数据库中的锁的情况
image

xid为739的锁被京城12264持有了,所以21052的进程获取锁标识为False

pg_locks并不能显示出每个行锁的信息,因为行锁信息并不会被记录到共享内存中。如果记录到内存,意味着对表做全表更新时,表有多少行就需要在内存中记录多少条行锁信息,那么内存会吃不消,所以postgreSQL设计成不在内存中记录行锁信息。


思考:如何获取进程是在哪一行上被阻塞的?

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

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

相关文章

GPT1,2,3

GPT1 transformer解码器因为有掩码所以不看后面的东西 gpt就是transformer的解码器,bert 是transformer的编码器 gpt核心卖点:不管输入如何,transformer模型不会变 半监督:先在没有标号上进行训练,再到有标号上进行微…

配置Nexus私服

私服是一种特殊的远程仓库,它代理广域网上的远程仓库,供局域网下的maven用户使用。 目前Nexus3的官方下载地址为 https://help.sonatype.com/repomanager3/product-information/download ,由于下载较慢(真的很慢)&…

【MySQL】库和表的增删查改

目录 一、库的操作 1、创建数据库 2、数据库所使用的编码 2.1查询编码集和校验集 2.2查看数据库的字符集和校验集 2.3创建数据库指定字符集和校验集 2.4不同的校验集所筛选的数据结果不一样 3、查看数据库 4、修改数据库 5、删除数据库 6、数据库的备份和恢复 6.1备…

数字图像处理期末复习习题 SCUEC part2

1.连续图像在空间位置上的离散化称为采样;图像空间分辨率由灰度级决定。 2.坐标的离散化叫采样,幅值的离散化叫量化。 3. 4.图像分割方法多种多样,一般可以根据像素灰度取值的特性将分割方法分为两类(阈值分割,区域分割…

软件工程开发文档写作教程(15)—概要设计书的编写

本文原创作者:谷哥的小弟作者博客地址:http://blog.csdn.net/lfdfhl本文参考资料:电子工业出版社《软件文档写作教程》 马平,黄冬梅编著 概要设计书的编写 按照国家《概要设计说明书GB8567—88)所定义的标准&#xff0…

算法刷题-链表-链表相交

链表相交 面试题 02.07. 链表相交思路其他语言版本JavaPythonGojavaScript 面试题 02.07. 链表相交 同:160.链表相交 力扣题目链接 给你两个单链表的头节点 headA 和 headB ,请你找出并返回两个单链表相交的起始节点。如果两个链表没有交点&#xff0…

chatgpt赋能python:Python如何填充空值

Python如何填充空值 在数据处理过程中,经常会遇到数据集中存在空值的情况。这些空值(或缺失值)可能会影响数据分析的准确性,因此我们需要对这些空值进行填充。Python作为一种流行的编程语言,提供了许多有效的方法来处…

【C++ 笔记四】STL 标准模板库 —— 容器基础

【C 笔记四】STL 标准模板库 —— 容器基础 文章目录 【C 笔记四】STL 标准模板库 —— 容器基础I - 概述 STL1.1 - 范围与定义1.2 - 组成与关系1.3 - 实用举例 II - 概述容器2.1 - 迭代器2.2 - 容器的结构与分类2.3 - 序列式容器2.4 - 关联式容器2.5 - 不定序容器2.6 - 总述 I…

.mdf.locked加密sql server完美恢复---惜分飞

有可能用友ERP软件的sql server 数据库所在机器被勒索病毒加密,扩展名为.locked和昨天恢复的基本类似(.locked加密勒索数据库级别恢复),通过分析确认sql server被这种病毒加密,也可以完美恢复 通过恢复之后数据库正常挂载成功 测试应用一切正常 对于类似这种被加密的勒索的数…

【Python开发】FastAPI 10:SQLAlchemy 数据库操作

在 FastAPI 中使用 SQL 数据库可以使用多个 ORM 工具,例如 SQLAlchemy、Tortoise ORM 等,类似 Java 的 Mybatis 。这些 ORM 工具可以帮助我们方便地与关系型数据库进行交互,如 MySQL 、PostgreSQL等。本篇文章将介绍如何使用 SQLAlchemy 来完…

chatgpt赋能python:Python的安装方法

Python的安装方法 简介 Python是一种非常流行的编程语言,它可以用于多种应用场景。Python简单易懂,可读性强,易于维护。因此,它成为了数据科学家、软件工程师和Web开发者的首选编程语言之一。 安装环境 在安装Python之前&…

【SpringBoot 3.x】整合Mybatis-Plus多数据源、Druid

本地开发环境说明 开发依赖版本Spring Boot3.0.6Mybatis-Plus3.5.3.1dynamic-datasource-spring-boot-starter3.6.1JDK20 pom.xml主要依赖 <dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-st…

MIT 6.S081 Lab Two

MIT 6.S081 Lab Two 引言system callsSystem call tracing&#xff08;moderate&#xff09;实验解析实现思路小结 Sysinfo&#xff08;moderate&#xff09;实验解析 可选的挑战 引言 本文为 MIT 6.S081 2020 操作系统 实验一解析。 MIT 6.S081课程前置基础参考: 基于RISC-V…

【C++】图解类和对象(下)

图解类和对象&#xff08;下&#xff09; 文章目录 图解类和对象&#xff08;下&#xff09;一、初始化列表&#xff08;1&#xff09;定义&#xff08;2&#xff09;注意事项&#xff08;3&#xff09;explicit关键字&#xff08;4&#xff09;结论 二、static成员1.定义2.特性…

windows一键安装redis7.0.11

下载 下载地址:https://gitcode.net/zengliguang/windows_redis7.0.11_offline_install.git 使用git进行进行clone下载 在电脑桌面或者其他文件夹下 &#xff0c;鼠标右键点击 选择git clone &#xff0c;下图中url为下载地址&#xff0c;Directory为本地存储路径&#xff…

【瑞萨RA_FSP】常用存储器介绍

文章目录 一、存储器种类二、 RAM存储器1. DRAM1.1 SDRAM1.2 DDR SDRAM 2. SRAM3. DRAM与SRAM的应用场合 三、非易失性存储器1. ROM存储器1.1 MASK ROM1.2 OTPROM1.3 EPROM1.4 EEPROM 2. FLASH存储器 一、存储器种类 存储器是计算机结构的重要组成部分。存储器是用来存储程序代…

chatgpt赋能python:Python安装Scrapy-提升爬虫效率的关键

Python安装Scrapy - 提升爬虫效率的关键 如果你正在寻找一个强大、高效的爬虫框架&#xff0c;那么Scrapy是你的不二选择。但在使用Scrapy之前&#xff0c;你必须先安装它。 本篇文章将向您介绍如何在Python环境中安装Scrapy&#xff0c;让您能够更快、更方便地运行和调试您的…

chatgpt赋能python:Python怎么安装PyCharm

Python怎么安装PyCharm PyCharm是一款专业的Python集成开发环境&#xff08;IDE&#xff09;&#xff0c;提供了丰富的功能和工具&#xff0c;能够极大地提高我们的开发效率。但是&#xff0c;在安装PyCharm之前&#xff0c;需要先确保Python已经安装并配置好了。本篇文章将详…

相机标定精度研究

张建贺实验设计 1 外参重复性精度测试&#xff1a; &#xff08;同内参&#xff0c;不同外参特征点,9选择4&#xff0c;组合&#xff09; 1 外参几乎没有什么重复性误差??? 只要4对都正确&#xff0c;则刚性匹配基本正确 解释&#xff1a;激光点云到相机 转换本身的刚性…