📜  PostgreSQL-锁

📅  最后修改于: 2020-11-26 06:33:45             🧑  作者: Mango


排他锁写锁可防止用户修改行或整个表。然后,在事务期间,由UPDATE和DELETE修改的行将被自动锁定。这样可以防止其他用户更改行,直到事务被提交或回滚为止。

用户必须等待其他用户的唯一时间是他们尝试修改同一行时。如果他们修改不同的行,则无需等待。 SELECT查询永远不必等待。

数据库自动执行锁定。但是,在某些情况下,必须手动控制锁定。可以使用LOCK命令完成手动锁定。它允许指定事务的锁类型和范围。

LOCK命令的语法

LOCK命令的基本语法如下-

LOCK [ TABLE ]
name
 IN
lock_mode
  • 名称-名称的现有表锁(任选模式修饰)。如果在表名之前指定了ONLY,则仅该表被锁定。如果未指定ONLY,则表及其所有后代表(如果有)将被锁定。

  • lock_mode-锁定模式指定与该锁定冲突的锁定。如果未指定锁定模式,则使用限制最大的ACCESS EXCLUSIVE模式。可能的值为:访问共享,行共享,行独占,共享更新独占,共享,共享行独占,独占,访问独占。

一旦获得,该锁将在当前事务的其余部分中保留。没有UNLOCK TABLE命令;锁始终在事务结束时释放。

死锁

当两个事务互相等待完成其操作时,可能会发生死锁。尽管PostgreSQL可以检测到它们并以ROLLBACK结尾,但是死锁仍然很不方便。为防止您的应用程序遇到此问题,请确保以将它们以相同顺序锁定对象的方式设计它们。

咨询锁

PostgreSQL提供了创建具有应用程序定义含义的锁的方法。这些称为咨询锁。由于系统不强制使用它们,因此应由应用程序来正确使用它们。咨询性锁定对于不适用于MVCC模型的锁定策略很有用。

例如,咨询锁的常见用法是模拟所谓的“平面文件”数据管理系统特有的悲观锁策略。虽然存储在表中的标志可以用于相同的目的,但咨询锁更快,可以避免表膨胀,并在会话结束时由服务器自动清除。

考虑具有以下记录的表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)

下面的示例以ACCESS EXCLUSIVE模式锁定testdb数据库中的COMPANY表。 LOCK语句仅在事务模式下有效-

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

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

LOCK TABLE

上面的消息表明表被锁定,直到事务结束为止,并且要完成事务,您将必须回滚或提交事务。