PostgreSQL 锁

PostgreSQL 锁

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

唯一需要用户等待其他用户的情况是他们试图修改同一行。如果他们修改不同的行,则不需要等待。SELECT查询永远不需要等待。

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

LOCK命令语法

LOCK命令的基本语法如下 –

LOCK [ TABLE ]
name
 IN
lock_mode
  • name − 现有表的名称(可选择带模式的)。如果在表名之前指定了ONLY,则只锁定该表。如果没有指定ONLY,则锁定该表及其所有子表(如果有)。

  • lock_mode − 锁模式指定此锁与哪些锁冲突。如果没有指定锁模式,则使用最严格的模式ACCESS EXCLUSIVE。可能的值有:ACCESS SHARE,ROW SHARE,ROW EXCLUSIVE,SHARE UPDATE EXCLUSIVE,SHARE,SHARE ROW EXCLUSIVE,EXCLUSIVE,ACCESS EXCLUSIVE。

一旦获得锁定,将在当前事务的剩余时间内保持锁定。没有UNLOCK TABLE命令;锁定总是在事务结束时释放。

死锁

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

Advisory锁

PostgreSQL提供了创建具有应用程序定义含义的锁的方法。这些被称为Advisory锁。由于系统不强制使用它们,所以由应用程序来正确使用它们。Advisory锁对于与MVCC模型不太匹配的锁策略可能是有用的。

例如,Advisory锁的常见用途是模拟所谓的“平面文件”数据管理系统的悲观锁定策略。虽然可以使用在表中存储的标志来实现相同的目的,但Advisory锁更快速,避免了表膨胀,并且在会话结束时由服务器自动清理。

示例

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

上述信息表明,直到事务结束之前表格都被锁定,要完成事务,你必须要么回滚(rollback)事务,要么提交(commit)事务。

Python教程

Java教程

Web教程

数据库教程

图形图像教程

大数据教程

开发工具教程

计算机教程