暂无图片
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


请输入正文
提交
相关推荐
pg中的autovacuum_freeze_max_age,如何正确理解??
回答 1
主要用途是调低触发freeze,预防不能进行事务号的“环绕”,也就是解决事务回卷问题。比如pg13之前,insertonly表就可能会产生。
postgresql13 安装完初始化以后,怎么把默认数据库挪到另外一个目录啊?
回答 1
可以参考下这篇哦PostgreSQL修改数据库目录/数据库目录迁移
pgbench 调用脚本不成功
回答 2
已采纳
1.你的命令可能有点问题nN语法是不对的2.可能跟你使用的数据库版本有关系我测试下面的语句是正常的pgbenchc2T20dpostgresUpostgresnMpreparedfupdateper2
wal中record的顺序?
回答 2
写入WAL的顺序
pg中有类似oracle中的arraysize类似的含义吗?
回答 1
DBeaver客户端,可设置,默认200行
pg中的CommitLog buffer对应的参数如何查看
回答 1
已采纳
Thereisnospecificparametertocontrolthisareaofmemory.Thisisautomaticallymanagedbythedatabaseengineint
同样的sql放到postgreSQL函数内执行会慢很多是什么问题?
回答 1
发出来看下?
max_parallel_workers的设置依赖cpu的核心数,这个核心数怎么确认
回答 1
在Linux中通过命令查看CPU核心数:lscpu或者nproc。通常建议这个值不要超过物理核心数的一半,以确保有足够的资源给其他系统进程,并避免因过多并行工作导致上下文切换开销过大而影响性能。
postgreSQL 有没有设置groupby 不检索全部字段?
回答 1
如果groupby是prikey就可以。否则就不支持。
postgresql从pg_roles里面查到的角色为什么比\du多?
回答 1
元命令输出结果通常会忽略内部的对象