PostgreSQL锁机制浅析

news/2024/7/9 20:19:07 标签: sql, 数据库, pgsql, postgresql, 经验分享

表级锁的类型

  • 1.ACCESS SHARE(访问共享锁)
  • 2.ROW SHARE(行共享锁)
  • 3.ROW EXCLUSIVE(行排他锁)
  • 4.SHARE UPDATE EXCLUSIVE(共享更新排他锁)
  • 5.SHARE(共享锁)
  • 6.SHARE ROW EXCLUSIVE(行共享排他锁)
  • 7.EXCLUSIVE(排它锁)
  • 8.ACCESS EXCLUSIVE(访问排他锁)
  • 9.表级锁冲突模式
  • 10.锁类型对应的数据库操作

表级锁的类型
可在pg源码/src/include/storage/lockdefs.h中查看对锁类型的定义和简单说明。
在这里插入图片描述

1.ACCESS SHARE(访问共享锁)

  • 只与ACCESS EXCLUSIVE锁冲突。
  • SELECT命令会在当前查询的表上获取一个ACCESS SHARE锁。总的来说,任何一个对表的只读操作都会获取该锁。

2.ROW SHARE(行共享锁)

  • 与EXCLUSIVE锁和ACCESS EXCLUSIVE锁冲突。
  • SELECT FOR UPDATE或者SELECT FOR SHARE命令会在目标表上获取该锁,并且所有被引用但是没有FOR UPDATE的表上会加上ACCESS SHARED锁。

3.ROW EXCLUSIVE(行排他锁)

  • 和SHARE,SHARE ROW EXCLUSIVE和ACCESS EXCLUSIVE锁冲突。
  • UPDATE,DELETE和INSERT会在目标表上获取该锁,总的来说,任何对数据库数据进行修改的命令会获取到该锁。

4.SHARE UPDATE EXCLUSIVE(共享更新排他锁)

  • 和SHARE UPDATE EXCLUSIVE,SHARE ROW EXCLUSIVE,EXCLUSIVE和ACCESS EXCLUSIVE冲突,该锁可以保护表防止并发的(schema)改变和VACUUM(释放空间)命令。
  • VACUUM,ANALYZE,CREATE INDEX CONCURRENTLY和ALTER TABLE VALIDATE以及其他ALTER TABLE类的命令会获取该锁。

5.SHARE(共享锁)

  • 和ROW EXCLUSIVE,SHARE UPDATE EXCLUSIVE,SHARE ROW EXCLUSIVE,EXCLUSIVE和ACCESS EXCLUSIVE锁冲突。该锁保护一个表防止并发的数据改变。
  • 由CREATE INDEX命令获得。

6.SHARE ROW EXCLUSIVE(行共享排他锁)

  • 和ROW EXCLUSIVE,SHARE UPDATE EXCLUSIVE,SHARE,SHARE ROW EXCLUSIVE,EXCLUSIVE以及ACCESS EXCLUSIVE锁冲突,该锁用于保护一个表防止并发的数据改变,同时是自排他的,所以在同一时间只有同一个session可以持有该锁。
  • 该锁不会被PGSQL的任何命令自动获取。

7.EXCLUSIVE(排它锁)

  • 和ROW SHARE,ROW EXCLUSIVE,SHARE UPDATE EXCLUSIVE,SHARE,SHARE ROW EXCLUSIVE,EXCLUSIVE和ACCESS EXCLUSIVE锁冲突。该锁只允许并发的ACCESS SHARE锁,只有只读操作能在一个事务持有排他锁的时候进行并发操作。

8.ACCESS EXCLUSIVE(访问排他锁)

  • 和所有的锁都冲突,该锁保证只有持有锁的事务能够访问当前表。
  • 被DROP TABLE,TRUNCATE,REINDEX,CLUSTER,VACUUM FULL和REFRESH MATERIALIZED VIEW命令自动获取。有很多种形式的ALTER TABLE命令可以获取该锁,它同样也是LOCK TABLE命令默认的锁级别。
  • 只有ACCESS EXCLUSIVE锁可以防止一个SELECT语句。

9.表级锁冲突模式

在这里插入图片描述

10.锁类型对应的数据库操作

锁类型对应的数据库操作
ACCESS SHARESELECT
ROW SHARESELECT FOR UPDATE,SELECT FOR SHARE
ROW EXCLUSIVEUPDATE,DELETE,INSERT
SHARE UPDATE EXCLUSIVEVACUUM(WITHOUT FULL),ANALYZE,CREATE INDEX CONCURRENTLY
SHARECREATE INDEX
SHARE ROW EXCLUSIVE任何命令不会自动获得
EXCLUSIVE任何命令不会自动获得
ACCESS EXCLUSIVEALTER TABLE,DROP TABLE,TRUNCATE,REINDEX,CLUSTER,VACUUM FULL

http://www.niftyadmin.cn/n/1786481.html

相关文章

appium文件夹下无.bin文件_如何批量获取同一文件夹下所有的文件名

关注表哥公众号的读者朋友们大家都了解我是最爱“偷懒”的,我说的偷懒当然指的是:『合理偷懒』今天给大家介绍一种批量获取同一文件夹下所有的文件名称的巧妙办法,能够帮忙我们合理偷懒,这也是我在工作实践中无意发现的。相信很多…

dubbo service注解用法_源码讲解Dubbo服务暴露过程

说明 所谓服务暴露,即是说服务可以被其他方调用,暴露形式有两种: 本地服务暴露远程服务暴露本章我们主要讲解远程服务暴露。 思考 既然说远程服务暴露,那么我们需要考虑几个问题: 服务以什么形式暴露?服务在哪里暴露(怎么能被使用者发现)?接下来我们来讲解dubbo远程服…

Xshell以及notepad++使用技巧

一、Xshell1. 常用快捷键2. 设置快捷输入按钮3. 右键粘贴选用的文字4. 自建快捷键5. 上传下载小文件6. 同时向多个会话、指令发送命令7. 将当前Shell中的内容复制到"记事本"中8. 日志功能二、NOTEPAD1. 快捷键2. 自动补全符号3. 同时编辑两个文件4. Alt鼠标拖拉 可进…

for in for of区别_during表示“在……区间”时,与for和in表示在某时间的区别是?...

【2019年11月28日 百天英语-Day126】【华东师范大学-林森撰写】昨日内容复习提要:昨天学习了主要学习了 ①save的用法,可以表示拯救,可以表示保存时,与store的区别。②now that的用法。昨天文章如下:save和store都能表…

python使用shellexecute系统找不到指定的文件_在Python中使用subprocess.call(‘dir’,shell = True)时找不到指定的文件

在安装了32位python 2.7的64位系统中,我正在尝试执行以下操作:import subprocessp subprocess.call(dir, shellTrue)print p但这给了我:Traceback (most recent call last):File "test.py", line 2, in p subprocess.call(dir, shellTrue)Fi…

解决Win10系统过期失效问题的经验总结

操作方法 系统安装完毕后,首先以WinR打开CMD命令行窗口,按下WinX,选择命令提示符(管理员)。 Win10专业版用户请依次输入: slmgr /ipk 解决方案 slmgr /skms kms.03k.org slmgr /ato即可成功 解决方案

网络协议时用什么语言编写的_为什么C语言编译器能用C语言编写?

很多人会有一个疑问C语言编译器为什么能够用C语言编写?今天就来带大家一探究竟!所谓C语言编译器,就是把编程得到的件,比如.c,.h的件,进行读取,并对内容进行分析,按照C语言的规则,将其…