鎖或獨占鎖或寫鎖,防止用戶修改行或整個表。然後,UPDATE和DELETE修改行獨占鎖定自動的事務的持續時間。這可以防止其他用戶更改行,直到該事務被提交或回滾。
有時候用戶必須等待其他用戶:當他們正試圖修改同一行,如果他們修改不同的行,無需等待。 SELECT查詢從來沒有等待。 數據庫自動進行鎖定。然而,在某些情況下,鎖定必須手動控制。手動鎖定可以通過使用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
上述消息表明,該表已被鎖定,直到事務結束並完成的事務,將回滾或提交事務。