鎖或獨(dú)占鎖或?qū)戞i阻止用戶修改行或整個(gè)表。 在UPDATE
和DELETE
修改的行在事務(wù)的持續(xù)時(shí)間內(nèi)被自動(dòng)獨(dú)占鎖定。 這將阻止其他用戶更改行,直到事務(wù)被提交或回退。
用戶必須等待其他用戶當(dāng)他們都嘗試修改同一行時(shí)。 如果他們修改不同的行,不需要等待。 SELECT查詢不必等待。
數(shù)據(jù)庫(kù)自動(dòng)執(zhí)行鎖定。 然而,在某些情況下,必須手動(dòng)控制鎖定。 手動(dòng)鎖定可以通過使用LOCK
命令完成。 它允許指定事務(wù)的鎖類型和范圍。
LOCK
命令的基本語法如下:
LOCK [ TABLE ]
name
IN
lock_mode
name
:要鎖定的現(xiàn)有表的鎖名稱(可選模式限定)。 如果在表名之前指定了ONLY
,則僅該表被鎖定 如果未指定ONLY
,則表及其所有后代表(如果有)被鎖定。lock_mode
:鎖模式指定此鎖與之沖突的鎖。 如果未指定鎖定模式,則使用最嚴(yán)格的訪問模式ACCESS EXCLUSIVE
。 可能的值是:ACCESS SHARE
,ROW SHARE
,ROW EXCLUSIVE
,SHARE UPDATE EXCLUSIVE
,SHARE
,SHARE ROW EXCLUSIVE
,EXCLUSIVE
,ACCESS EXCLUSIVE
。當(dāng)兩個(gè)事務(wù)正在等待彼此完成操作時(shí),可能會(huì)發(fā)生死鎖。 雖然PostgreSQL可以檢測(cè)到它們并使用ROLLBACK
結(jié)束,但死鎖仍然可能不方便。 為了防止您的應(yīng)用程序遇到此問題,請(qǐng)確保以這樣的方式進(jìn)行設(shè)計(jì),以使其以相同的順序鎖定對(duì)象。
PostgreSQL提供了創(chuàng)建具有應(yīng)用程序定義含義的鎖的方法。這些稱為咨詢鎖(勸告鎖,英文為:advisory locks)。 由于系統(tǒng)不強(qiáng)制使用它,因此應(yīng)用程序正確使用它們。 咨詢鎖可用于鎖定針對(duì)MVCC模型策略。
例如,咨詢鎖的常見用途是模擬所謂的“平面文件”數(shù)據(jù)管理系統(tǒng)的典型的悲觀鎖定策略。 雖然存儲(chǔ)在表中的標(biāo)志可以用于相同的目的,但是建議鎖更快,避免了表的膨脹,并且在會(huì)話結(jié)束時(shí)被服務(wù)器自動(dòng)清除。
考慮表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
表鎖定在yiibai_db
數(shù)據(jù)庫(kù)中。 LOCK
語句僅在事務(wù)模式下工作:
yiibai_db=#BEGIN;
LOCK TABLE company1 IN ACCESS EXCLUSIVE MODE;
PostgreSQL上面的語句將產(chǎn)生以下結(jié)果:
LOCK TABLE
上述消息表示表被鎖定,直到事務(wù)結(jié)束并完成事務(wù),必須回滾或提交事務(wù)。