锁或独占锁或写锁阻止用户修改行或整个表。 在update
和delete
修改的行在事务的持续时间内被自动独占锁定。 这将阻止其他用户更改行,直到事务被提交或回退。
用户必须等待其他用户当他们都尝试修改同一行时。 如果他们修改不同的行,不需要等待。 select查询不必等待。
数据库自动执行锁定。 然而,在某些情况下,必须手动控制锁定。 手动锁定可以通过使用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
。当两个事务正在等待彼此完成操作时,可能会发生死锁。 虽然postgresql可以检测到它们并使用rollback
结束,但死锁仍然可能不方便。 为了防止您的应用程序遇到此问题,请确保以这样的方式进行设计,以使其以相同的顺序锁定对象。
postgresql提供了创建具有应用程序定义含义的锁的方法。这些称为咨询锁(劝告锁,英文为:advisory locks)。 由于系统不强制使用它,因此应用程序正确使用它们。 咨询锁可用于锁定针对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
模式下将company
表锁定在h3_db
数据库中。 lock
语句仅在事务模式下工作:
h3_db=#begin;
lock table company1 in access exclusive mode;
postgresql上面的语句将产生以下结果:
lock table
上述消息表示表被锁定,直到事务结束并完成事务,必须回滚或提交事务。