鍍金池/ 教程/ 數(shù)據(jù)庫(kù)/ PostgreSQL鎖
PostgreSQL LIKE條件
PostgreSQL截?cái)啾恚═RUNCATE TABLE語句)
C/C++連接PostgreSQL數(shù)據(jù)庫(kù)
PostgreSQL別名
PostgreSQL日期和時(shí)間函數(shù)
PostgreSQL NOT IN條件
PostgreSQL歷史
PostgreSQL事務(wù)
PostgreSQL AND & OR條件
PostgreSQL NULL值
PostgreSQL教程
PostgreSQL更新數(shù)據(jù)(UPDATE語句)
PostgreSQL ORDER BY子句
PostgreSQL分組(GROUP BY子句)
PostgreSQL數(shù)據(jù)類型
PostgreSQL特點(diǎn)
PostgreSQL刪除數(shù)據(jù)庫(kù)
PostgreSQL UNIONS子句
PostgreSQL AND條件
PostgreSQL索引
PostgreSQL刪除表
Perl連接PostgreSQL數(shù)據(jù)庫(kù)
PostgreSQL視圖
PostgreSQL修改表(ALTER TABLE語句)
PostgreSQL全外連接
PostgreSQL命令語法大全
PostgreSQL查詢數(shù)據(jù)(SELECT語句)
PostgreSQL自動(dòng)遞增
PostgreSQL左外連接
PostgreSQL創(chuàng)建表
PostgreSQL模式(架構(gòu))
PostgreSQL觸發(fā)器
PostgreSQL安裝(Windows)
PostgreSQL NOT條件
PostgreSQL Having子句
PostgreSQL函數(shù)(存儲(chǔ)過程)
Java連接PostgreSQL數(shù)據(jù)庫(kù)
PostgreSQL權(quán)限
PostgreSQL OR條件
PostgreSQL創(chuàng)建數(shù)據(jù)庫(kù)
PostgreSQL BETWEEN條件
PostgreSQL IN條件
Python連接PostgreSQL數(shù)據(jù)庫(kù)
PostgreSQL刪除數(shù)據(jù)(DELETE語句)
PostgreSQL子查詢
PostgreSQL右外連接
PostgreSQL插入數(shù)據(jù)(INSERT語句)
PostgreSQL是什么?
PostgreSQL連接(內(nèi)連接)
PHP連接PostgreSQL數(shù)據(jù)庫(kù)
PostgreSQL條件查詢
PostgreSQL鎖
PostgreSQL跨連接(CROSS JOIN)

PostgreSQL鎖

鎖或獨(dú)占鎖或?qū)戞i阻止用戶修改行或整個(gè)表。 在UPDATEDELETE修改的行在事務(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命令的基本語法如下:

LOCK [ TABLE ]
name
 IN
lock_mode
  • name:要鎖定的現(xiàn)有表的鎖名稱(可選模式限定)。 如果在表名之前指定了ONLY,則僅該表被鎖定 如果未指定ONLY,則表及其所有后代表(如果有)被鎖定。
  • lock_mode:鎖模式指定此鎖與之沖突的鎖。 如果未指定鎖定模式,則使用最嚴(yán)格的訪問模式ACCESS EXCLUSIVE。 可能的值是:ACCESS SHARE,ROW SHAREROW EXCLUSIVE,SHARE UPDATE EXCLUSIVESHARE,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ù)。