PostgreSQL鎖
鎖或獨占鎖或寫鎖,防止用戶修改行或整個表。然後,UPDATE和DELETE修改行獨占鎖定自動的事務的持續時間。這可以防止其他用戶更改行,直到該事務被提交或回滾。
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
上述消息表明,該表已被鎖定,直到事務結束並完成的事務,將回滾或提交事務。