PostgreSQL LOCK(鎖)
鎖主要是為了保持資料庫數據的一致性,可以阻止用戶修改一行或整個表,一般用在併發較高的資料庫中。
在多個用戶訪問資料庫的時候若對併發操作不加控制就可能會讀取和存儲不正確的數據,破壞資料庫的一致性。
資料庫中有兩種基本的鎖:排它鎖(Exclusive Locks)和共用鎖(Share Locks)。如果數據對象加上排它鎖,則其他的事務不能對它讀取和修改。
如果加上共用鎖,則該資料庫對象可以被其他事務讀取,但不能修改。
LOCK 命令語法
LOCK 命令基礎語法如下:
LOCK [ TABLE ] name IN lock_mode
- name:要鎖定的現有表的名稱(可選模式限定)。如果只在表名之前指定,則只鎖定該表。如果未指定,則鎖定該表及其所有子表(如果有)。
- lock_mode:鎖定模式指定該鎖與哪個鎖衝突。如果沒有指定鎖定模式,則使用限制最大的訪問獨佔模式。可能的值是:ACCESS SHARE,ROW SHARE, ROW EXCLUSIVE, SHARE UPDATE EXCLUSIVE, SHARE,SHARE ROW EXCLUSIVE,EXCLUSIVE,ACCESS EXCLUSIVE。
一旦獲得了鎖,鎖將在當前事務的其餘時間保持。沒有解鎖表命令;鎖總是在事務結束時釋放。
死鎖
當兩個事務彼此等待對方完成其操作時,可能會發生死鎖。儘管 PostgreSQL 可以檢測它們並以回滾結束它們,但死鎖仍然很不方便。為了防止應用程式遇到這個問題,請確保將應用程式設計為以相同的順序鎖定對象。
諮詢鎖
PostgreSQL 提供了創建具有應用程式定義含義的鎖的方法。這些被稱為諮詢鎖。由於系統不強制使用它們,所以正確使用它們取決於應用程式。諮詢鎖對於不適合 MVCC 模型的鎖定策略非常有用。
例如,諮詢鎖的一個常見用途是模擬所謂"平面檔"數據管理系統中典型的悲觀鎖定策略。雖然存儲在表中的標誌可以用於相同的目的,但是通知鎖更快,避免了表膨脹,並且在會話結束時由伺服器自動清理。
實例
創建 COMPANY 表(下載 COMPANY SQL 檔 ),數據內容如下:
zaixiandb# 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)
下麵的示例將 zaixiandb 資料庫中的 COMPANY 表鎖定為 ACCESS EXCLUSIVE 模式。
LOCK 語句只在事務模式下工作。
zaixiandb=#BEGIN; LOCK TABLE company1 IN ACCESS EXCLUSIVE MODE;
上面操作將得到下麵結果:
LOCK TABLE
上面的消息指示表被鎖定,直到事務結束,並且要完成事務,您必須回滾或提交事務。