暂无图片
PostgreSQL中有8种锁,分别是什么锁?
我来答
分享
宇飞
2023-07-03
PostgreSQL中有8种锁,分别是什么锁?

PostgreSQL中有8种锁,分别是什么锁?

我来答
添加附件
收藏
分享
问题补充
2条回答
默认
最新

PostgreSQL的8种锁中,最普通的是共享锁“SHARE”和排它锁“EXCLUSIVE”,因为多版本的原因,修改一条数据的同时允许读数据,所以为了处理这种情况,又加了两种锁“ACCESS SHARE”和“ACCESS EXCLUSIVE”,所以锁中的“ACCESS”这个关键字是与多版本读相关的。此外,为了处理表锁和行锁之间的关系,于是有意向锁的概念,这时又加了两种锁,即意向共享锁和意向排它锁,这样就有了6种锁。由于意向锁之间不会产生冲突,而且意向排它锁互相之间也不会产生冲突,于是又需要更严格一些的锁,这样就产生了SHARE UPDATE EXCLUSIVE和SHARE ROW EXCLUSIVE两种锁。

暂无图片 评论
暂无图片 有用 11
打赏 0
暂无图片

在 PostgreSQL 中,常见的锁类型有以下八种:

  1. 共享锁(Share Lock):也称为读锁。多个事务可以同时持有共享锁,用于并发地读取数据。共享锁之间不会产生冲突,并阻止其他事务获取排他锁。

  2. 排他锁(Exclusive Lock):也称为写锁。只有一个事务可以持有排他锁,并且其他事务无法获取共享锁或其他排他锁,从而实现了独占式的修改操作。

  3. 更新锁(Update Lock):实际上是共享锁和排他锁的组合。它允许事务在读取期间保持共享锁,但在更新之前必须将共享锁升级为排他锁。这种锁类型有助于解决并发更新中的资源竞争问题。

  4. 排他与更新兼容锁(Exclusive Row-Level Lock / Update-Exclusive Row-Level Lock):这两种锁类型主要用于行级别的锁定。排他锁保护特定行以进行写操作,而更新兼容锁则允许其他事务对行进行共享读取,但是仍然禁止同时持有排他锁。

  5. 共享与更新兼容锁(Share Row-Level Lock / Share-Row Exclusive Lock):这两种锁类型也适用于行级别的锁定。共享锁允许多个事务进行并发读取操作,但不允许进行写操作。而更新兼容锁允许单独的事务对行进行写操作,但阻止其他事务同时获取排他锁。

  6. 共享与排他兼容锁(Share-Update Exclusive Lock):是一种特殊类型的行级别锁。它在允许共享锁和更新锁之间提供了一种更高级别的互斥。

  7. 空闲锁(Idle Lock):是一个特殊的锁状态,用于标识某个事务持有了一个锁但没有后续操作。这种锁通常出现在长时间运行事务中或由于异常情况导致的中断操作。

  8. 虚拟XID锁(Virtual Transaction ID Lock):用于保护使用虚拟事务 ID 的系统表的内部状态。

需要注意的是,PostgreSQL 根据具体情况自动选择合适的锁,并且提供了高度可配置的并发控制机制,使开发人员能够灵活地管理锁定和并发访问。

暂无图片 评论
暂无图片 有用 0
打赏 0
回答交流
Markdown


请输入正文
提交
相关推荐
流复制如何特意模拟主从有延时,测试该场景下的切换问题
回答 1
直接测试备库故障切换吧
请高手在pg库下写个耗cpu和内存的sql,有没有简单点的?
回答 1
搞个大表,做个笛卡尔积关联,做个全表扫描
怎么查询postgreSQL表空间使用率?
回答 1
我替你问了下度娘https://www.cnblogs.com/liuyuanyuanGOGO/p/3224554.html
pg如果在匿名块insert传入的是参数而不是具体值时,会有个数限制吗?
回答 1
已采纳
postgresql源代码为:publicvoidsendInteger2(intval)throwsIOException{if(val>32768&&val<32767
postgresql 数据库宕机之后,如果索引不对了,数据库会怎么恢复?
回答 2
已采纳
何为索引不对了?数据库启动是一个自检过程,只要各个数据文件日志文件等等一致性(检查点一致)检查通过就能启动。
plsql连接不上Oracle,报错不能初始化
回答 2
已采纳
使用sqldeveloper连接工具连接oracle;https://www.oracle.com/tools/downloads/sqldevdownloads.html
pg中用dd模拟表损坏?
回答 5
暂无文字回复
postgreSQL barman是物理备份,没法进行单个表的恢复吧?
回答 1
在Barman中进行单个表的恢复需要经过以下几个步骤:1、确定需要恢复的表所在的数据库以及备份集的时间点。可以使用barmanlistbackup<server>命令查看备份集列表,使用b
查询表空间大小 pg tablespace size 和空间内对象大小 pg total relation size 结果相差了一倍 这个问题该怎么处理后续?
回答 1
在PostgreSQL中,查询表空间(tablespace)大小和表空间内对象大小的结果可能会有显著差异,这是因为表空间包括的不仅仅是表和索引的数据,还有其他因素,如元数据、维护用的TOAST表和空闲
在postgresql中用枚举来代替字典,如何做到类似添加字典值的功能给自定义的枚举加枚举值?
回答 7
使用这个语句altertypeXXXaddvalueyyy...再赠送一个问题,该语句属于DDL,应用层如果要防注入可以使用函数封装createtypecurrencyasenum('USD','EU