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 结束它们,但死锁仍然很不方便。为防止您的应用程序遇到此问题,请确保将它们设计为以相同的顺序锁定对象。

咨询锁

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

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

觉得文章有用?

点个广告表达一下你的爱意吧 !😁