首页 > 数据库 >【postgresql】锁

【postgresql】锁

时间:2024-07-14 09:55:17浏览次数:14  
标签:EXCLUSIVE postgresql SHARE UPDATE ACCESS 冲突 ROW

PostgreSQL 提供了多种锁模式来控制对表和行的并发访问,以确保数据的一致性和完整性。这些锁模式包括表级锁和行级锁,它们可以由应用程序显式控制,也可以在执行大多数 PostgreSQL 命令时自动获取。

锁类型

PostgreSQL类型的锁包括:

  • 表级锁(Table-Level Locks)

    • ACCESS SHARE:通常在SELECT语句中自动获取,只与ACCESS EXCLUSIVE锁冲突。

    • ROW SHARE:通常在SELECT FOR UPDATE/FOR SHARE语句中自动获取,与EXCLUSIVEACCESS EXCLUSIVE锁冲突。

    • ROW EXCLUSIVE:通常在INSERT、UPDATE、DELETE语句中自动获取,与SHARESHARE ROW EXCLUSIVEEXCLUSIVEACCESS EXCLUSIVE锁冲突。

    • SHARE UPDATE EXCLUSIVE:保护表不受并发模式改变和VACUUM的影响,与SHARE UPDATE EXCLUSIVESHARESHARE ROW EXCLUSIVEEXCLUSIVEACCESS EXCLUSIVE锁冲突。

    • SHARE:通常在CREATE INDEX语句中自动获取,与ROW EXCLUSIVESHARE UPDATE EXCLUSIVESHARE ROW EXCLUSIVEEXCLUSIVEACCESS EXCLUSIVE锁冲突。

    • SHARE ROW EXCLUSIVE:保护表不受并发数据修改,与ROW EXCLUSIVESHARE UPDATE EXCLUSIVESHARESHARE ROW EXCLUSIVEEXCLUSIVEACCESS EXCLUSIVE锁冲突。

    • EXCLUSIVE:允许并发只读访问,但阻止其他事务进行写操作,与ROW SHAREROW EXCLUSIVESHARE UPDATE EXCLUSIVESHARESHARE ROW EXCLUSIVEEXCLUSIVEACCESS EXCLUSIVE锁冲突。

    • ACCESS EXCLUSIVE:最高级别的锁,确保只有持有锁的事务可以访问表,与所有类型的锁冲突。

  • 行级锁(Row-Level Locks)

    • FOR UPDATE:锁定选定的行,防止其他事务对这些行进行修改或删除。

    • FOR NO KEY UPDATE:类似于FOR UPDATE,但不阻止其他事务对这些行进行SELECT FOR KEY SHARE。

    • FOR SHARE:类似于FOR UPDATE,但只锁定读取的行,不阻止其他事务对这些行进行修改。

    • FOR KEY SHARE:类似于FOR SHARE,但只阻止其他事务对这些行进行DELETE或UPDATE关键字列。

使用锁

通过以下方式显式地获取锁:

LOCK TABLE table_name IN lock_mode_name MODE;

获取一个表的ACCESS EXCLUSIVE锁:

BEGIN;

LOCK TABLE my_table IN ACCESS EXCLUSIVE MODE;

COMMIT;

检测和解决死锁

以通过查询系统视图 pg_lockspg_stat_activity 来检测死锁和锁定情况。例如,查询特定表的锁情况可以使用以下 SQL 语句:

SELECT a.locktype, a.database, a.pid, a.mode, a.relation, b.relname
FROM pg_locks a
JOIN pg_class b ON a.relation = b.oid
WHERE upper(b.relname) = 'TABLE_NAME';




标签:EXCLUSIVE,postgresql,SHARE,UPDATE,ACCESS,冲突,ROW
From: https://blog.csdn.net/wochunyang/article/details/140401045

相关文章

  • 在 PostgreSQL(简称 pg)数据库中,普通用户修改自己的密码可以通过 SQL 命令完成?可以
    查看权限ALTERUSERusernameWITHPASSWORD'newpassword';如果你是以普通用户身份登录,通常你只能更改自己的密码,而不能更改其他用户的密码。在PostgreSQL中,普通用户通常拥有的权限取决于他们在数据库中的角色和分配给他们的权限。数据库管理员(DBA)可以为不同的用......
  • PostgreSQL 中如何处理数据的存储压缩和查询性能的平衡?
    文章目录PostgreSQL中数据存储压缩与查询性能的平衡之道PostgreSQL中数据存储压缩与查询性能的平衡之道在数据库管理的广袤领域中,PostgreSQL犹如一位稳重可靠的智者,为我们提供了丰富的功能和强大的性能。然而,当面对数据存储压缩和查询性能这对“欢喜冤家”时,如......
  • PostgreSQL 如何应对因数据类型转换导致的性能损耗?
    文章目录PostgreSQL如何应对因数据类型转换导致的性能损耗PostgreSQL如何应对因数据类型转换导致的性能损耗在数据库管理的广袤世界中,PostgreSQL如同一位可靠的伙伴,为我们提供了强大的数据存储和处理能力。然而,就像任何复杂的系统一样,它也面临着一些挑战,其中因......
  • 在 PostgreSQL 里如何实现数据的分布式查询的负载均衡?
    文章目录在PostgreSQL中实现数据分布式查询的负载均衡在PostgreSQL中实现数据分布式查询的负载均衡在当今数字化时代,数据量呈爆炸式增长,对于大规模数据处理的需求也日益迫切。在PostgreSQL中实现数据的分布式查询负载均衡成为了提升系统性能和可用性的关键......
  • PostgreSQL逻辑复制搭建
    复制作为一种高可用/数据同步方案,在每一种数据库中都有实现,可以借助复制功能实现数据库的高可用或者数据同步/备份方案。复制的分类整体上看,复制可以分为物理复制和逻辑复制,对于物理复制或者逻辑复制,没有所谓的优劣,只有各自的适应场景。所谓的物理复制,也即复制数据库的redo物理......
  • PostgreSQL的AutoVacuum原理及autovacuum不工作问题解析
    1、AutoVacuum概述PostgreSQL数据库是有数据清理的,有人工执行清理,也有自动清理,但是这2种的清理方式对性能是有不同的影响,特别是OLTP环境中,每次不管是人工清理还是自动清理deadtuple,都会对数据库的IO有明显的影响,基于PostgreSQL的原理每个表中的行会存在多个版本的数据,为了完成......
  • openEuler安装postgresql
    yuminstall-ygccmakereadline-develzlib-devellibicu-develcd/usr/localtarzxvfpostgresql-16.0.tar.gzcdpostgresql-16.0./configure--prefix=/usr/local/postgresqlmake-j8&&makeinstalladduser postgresmkdir/usr/local/postgresql/datac......
  • 在openEuler 22.03上使用yum安装PostgreSQL单机环境
    环境申请由于环境要国产化,选择openEuler22.03LTS系统,这里测试一下在openEuler上安装PG,过程如下。代码语言:javascript复制dockerrm-flhropeneuler22dockerrun-itd--namelhropeneuler22-hlhropeneuler22\-p15432:5432-p7389:3389\--privileged=true......
  • Q:在PostgreSQL中跟踪和分析查询日志
    在PostgreSQL中,跟踪和分析查询日志是排查性能瓶颈的重要步骤。通过查看和分析查询日志,我们可以了解哪些查询在执行时遇到了问题,例如执行时间过长、资源消耗过大等。以下是一些建议和步骤,帮助你有效地跟踪和分析PostgreSQL的查询日志。 启用查询日志首先,你需要启用查询日志功......
  • nginx作为反向代理服务器:代理MySQL、Postgresql、Redis及多个TCP服务
    使用Nginx作为反向代理服务器,可以代理MySQL、PostgreSQL、Redis及多个TCP服务。这需要配置Nginx的stream模块。以下是详细的配置步骤:1.确保Nginx支持stream模块首先,确保Nginx已经编译并支持stream模块。运行以下命令检查:nginx-V在输出中查找--with-str......