鎖或獨佔鎖或寫鎖阻止用戶修改行或整個表。 在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
。
死鎖
當兩個事務正在等待彼此完成操作時,可能會發生死鎖。 雖然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
表鎖定在zaixian_db
資料庫中。 LOCK
語句僅在事務模式下工作:
zaixian_db=#BEGIN;
LOCK TABLE company1 IN ACCESS EXCLUSIVE MODE;
PostgreSQL上面的語句將產生以下結果:
LOCK TABLE
上述消息表示表被鎖定,直到事務結束並完成事務,必須回滾或提交事務。
上一篇:
PostgreSQL事務
下一篇:
PostgreSQL子查詢