【postgresql】锁

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';




相关推荐

  1. PostgreSQL 和Oracle机制对比

    2024-07-15 00:26:04       30 阅读
  2. PostgresSQL中的死等待

    2024-07-15 00:26:04       38 阅读
  3. Postgresql 连接数查看,死问题解决

    2024-07-15 00:26:04       38 阅读
  4. PostgreSQL开发与实战(8.1)PG的1

    2024-07-15 00:26:04       40 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-07-15 00:26:04       66 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-07-15 00:26:04       70 阅读
  3. 在Django里面运行非项目文件

    2024-07-15 00:26:04       57 阅读
  4. Python语言-面向对象

    2024-07-15 00:26:04       68 阅读

热门阅读

  1. DelphiXE内存泄漏问题,已经发生了很多次

    2024-07-15 00:26:04       22 阅读
  2. ros2--colcon

    2024-07-15 00:26:04       19 阅读
  3. 行人越界检测 越线 越界区域 多边形IOU越界判断

    2024-07-15 00:26:04       22 阅读
  4. Vscode插件推荐——智能切换输入法(Smart IME)

    2024-07-15 00:26:04       19 阅读