PHP开发教程

PostgreSQL锁

锁或独占锁或写锁,防止用户修改行或整个表。然后,UPDATE和DELETE修改行独占锁定自动的事务的持续时间。这可以防止其他用户更改行,直到该事务被提交或回滚。

有时候用户必须等待其他用户:当他们正试图修改同一行,如果他们修改不同的行,无需等待。 SELECT查询从来没有等待。

 

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

LOCK命令的语法

LOCK命令的基本语法如下:


LOCK [ TABLE ]name
 IN
lock_mode
  • name: 锁现有的表的名称(可以有模式修饰)。如果只指定表名前,只有表被锁定。如果未指定,表和所有其派生表(如果有的话)被锁定。

  • 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)

下面的例子锁定本公司表内testdb数据库ACCESS EXCLUSIVE模式。的锁定语句只在的事务模式:

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

以上PostgreSQL的表会产生以下结果:


LOCK TABLE

上述消息表明,该表已被锁定,直到事务结束并完成的事务,将回滚或提交事务。


Powered by PHP二次开发 ©2008-2017