Postgresql 简明教程

PostgreSQL - LOCKS

锁或排他锁或写锁可防止用户修改行或整个表。随后对 UPDATE 和 DELETE 修改的行在事务期间自动独占锁定。这可以防止其他用户在提交或回滚事务之前更改该行。

用户必须等待其他用户的情况仅当他们尝试修改同一行时出现。而当他们修改不同行时,不需要等待。SELECT 查询绝不会出现等待。

数据库会自动执行锁定。然而,在某些情况下,锁定必须手动控制。可以通过使用 LOCK 命令实现手动锁定。它允许用户指定事务的锁定类型和范围。

Syntax for LOCK command

LOCK 命令的基本语法如下−

LOCK [ TABLE ]
name
 IN
lock_mode
  1. name −要锁定的现有表名(可选,模式限定)。如果在表名前指定 ONLY,就只锁定那张表。如果未指定 ONLY,就锁定该表以及其所有子表(如果有的)。

  2. lock_mode −锁定模式指定此锁定与哪些锁定冲突。如果未指定锁定模式,就使用访问排他模式,即最严格的模式。可能的值为:访问共享、行共享、行排他、共享更新排他、共享、共享行排他、排他、访问排他。

DeadLocks

当两个事务都等待对方完成各自的操作时,就会发生死锁。不过,尽管 PostgreSQL 可以检测到死锁并通过 ROLLBACK 结束它们,死锁仍然会造成不便。为了防止你的应用程序遇到此问题,务必使用相同的方式设计应用程序中的对象,以实现锁定。

Advisory Locks

PostgreSQL 可以创建具有应用程序定义的含义的锁定,称之为咨询锁定。因为系统并不会强制使用这些锁定,应用程序必须正确使用。咨询锁定可用于不适合 MVCC 模式的锁定策略。

例如,咨询锁定的一个常见用法是模拟典型的所谓“平面文件”数据管理系统的悲观锁定策略。虽然存储在表中的标记可用作相同目的,但咨询锁定更高效,可以避免表膨胀,而且会在会话结束时由服务器自动清除。

Example

考虑 COMPANY 表具有以下记录:

testdb# select * from COMPANY;
 id | name  | age | address   | salary
----+-------+-----+-----------+--------
  1 | Paul  |  32 | California|  20000
  2 | Allen |  25 | Texas     |  15000
  3 | Teddy |  23 | Norway    |  20000
  4 | Mark  |  25 | Rich-Mond |  65000
  5 | David |  27 | Texas     |  85000
  6 | Kim   |  22 | South-Hall|  45000
  7 | James |  24 | Houston   |  10000
(7 rows)

以下示例以访问排他模式锁定 testdb 数据库中的 COMPANY 表。LOCK 语句仅在事务模式下使用−

testdb=#BEGIN;
LOCK TABLE company1 IN ACCESS EXCLUSIVE MODE;

以上给出的 PostgreSQL 语句将产生以下结果 -

LOCK TABLE

以上消息表示该表会在事务结束前被锁定,要结束事务,你必须回滚或提交事务。