Postgresql 简明教程
PostgreSQL - LOCKS
锁或排他锁或写锁可防止用户修改行或整个表。随后对 UPDATE 和 DELETE 修改的行在事务期间自动独占锁定。这可以防止其他用户在提交或回滚事务之前更改该行。
用户必须等待其他用户的情况仅当他们尝试修改同一行时出现。而当他们修改不同行时,不需要等待。SELECT 查询绝不会出现等待。
数据库会自动执行锁定。然而,在某些情况下,锁定必须手动控制。可以通过使用 LOCK 命令实现手动锁定。它允许用户指定事务的锁定类型和范围。
Syntax for LOCK command
LOCK 命令的基本语法如下−
LOCK [ TABLE ]
name
IN
lock_mode
-
name −要锁定的现有表名(可选,模式限定)。如果在表名前指定 ONLY,就只锁定那张表。如果未指定 ONLY,就锁定该表以及其所有子表(如果有的)。
-
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
以上消息表示该表会在事务结束前被锁定,要结束事务,你必须回滚或提交事务。