发布于 2015-07-12 03:01:47 | 362 次阅读 | 评论: 0 | 来源: 网络整理
锁或独占锁或写锁,防止用户修改行或整个表。然后,UPDATE和DELETE修改行独占锁定自动的事务的持续时间。这可以防止其他用户更改行,直到该事务被提交或回滚。
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
上述消息表明,该表已被锁定,直到事务结束并完成的事务,将回滚或提交事务。