排他锁或写锁可防止用户修改行或整个表,然后,在事务期间,由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。
死锁(DeadLocks)
当两个事务正在彼此等待完成其操作时,可能会发生死锁,为防止您的应用程序遇到此问题,请确保以将它们以相同顺序锁定对象的方式设计它们。
LOCK示例
考虑表COMPANY 具有以下记录:
testdb# select * from COMPANY; id | name | age | address | salary ----+-------+-----+-----------+-------- 1 | Paul | 32 | California| 20000 2 | Learnfk | 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
上面的消息表明表被锁定,直到事务结束为止,并且要完成事务,您将必须回滚或提交事务。
参考链接
https://www.learnfk.com/postgresql/postgresql-locks.html
标签:EXCLUSIVE,事务,PostgreSQL,LOCK,SHARE,无涯,ACCESS,Locks,锁定 From: https://blog.51cto.com/u_14033984/8969210