最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

PostgreSQL如何查看事務(wù)所占有的鎖實操指南

 更新時間:2023年10月24日 15:35:00   作者:賈欣曉  
這篇文章主要給大家介紹了關(guān)于PostgreSQL如何查看事務(wù)所占有鎖的相關(guān)資料,文中通過代碼以及圖文介紹的非常詳細(xì),對大家學(xué)習(xí)或者使用PostgreSQL具有一定的參考借鑒價值,需要的朋友可以參考下

表級鎖命令LOCK TABLE

在PG中,顯式地在表上加鎖的命令為“LOCK TABLE”,此命令的語法如下:

LOCK [TABLE] [ONLY] name [,...][IN lockmode MODE] [NOWAIT]

語法中各項參數(shù)說明如下:

  • name:表名
  • lockmode:表級鎖模式,即SHARE、EXCLUSIVE、ACCESS SHARE、ACCESS EXCLUSIVE、ROW SHARE、ROW EXCLUSIVE、SHARE UPDATE EXCLUSIVE、SHARE ROW EXCLUSIVE
  • NOWAIT:如果沒有NOWAIT這個關(guān)鍵字,當(dāng)無法獲得鎖時會一直等待,而如果加了NOWAIT關(guān)鍵字,在無法立即獲取該鎖時,此命令會立即退出并且報錯

在PG中,事務(wù)自己的鎖是從不沖突的,因此一個事務(wù)可以在持有SHARE模式的鎖時再請求ROW EXCLUSIVE鎖,而不會出現(xiàn)自己的鎖阻塞自己的情況。

當(dāng)事務(wù)要更新表中的數(shù)據(jù)時,應(yīng)該申請ROW EXCLUSIVE鎖,而不應(yīng)該申請SHARE鎖,因為在更新數(shù)據(jù)時,事務(wù)還是會對表加ROW EXCLUSIVE鎖,想象一下,在兩個并發(fā)的事務(wù)都請求SHARE鎖后,開始更新數(shù)據(jù)前要對表加ROW EXCLUSIVE鎖,但由于各自先前已加了SHARE鎖,所以都要等待對方釋放SHARE鎖,因而出現(xiàn)死鎖。從這個示例可以看出,如果涉及多種鎖模式,那么事務(wù)應(yīng)該總是最先請求最嚴(yán)格的鎖模式,否則就容易出現(xiàn)死鎖。

行級鎖命令

顯式的行級鎖命令是由SELECT命令后加如下子句來構(gòu)成的:

SELECT ... FOR {UPDATE | SHARE} [OF table_name [,...]] [NOWAIT] [...]

  • NOWAIT關(guān)鍵字加上,如果無法獲得鎖則直接報錯,而不會一直等待。
  • OF table_name明確指定表名字,那么只有被指定的表會被鎖定,其他在SELECT中使用的表則不會
  • 不帶OF table_name的FOR UPDATE或者FOR SHARE子句將鎖定該命令中使用的所有表
  • 如果FOR UPDATE或者FOR SHARE應(yīng)用于一個視圖或者子查詢,那么它將同樣鎖定該視圖或者子查詢中使用到的所有表
  • 主查詢中引用了WITH查詢時,WITH查詢中的表并不會被鎖定
  • 如果想要鎖定WITH查詢內(nèi)的表行,需要在WITH查詢內(nèi)指定FOR UPDATE或者FOR SHARE關(guān)鍵字

鎖的查看

我們經(jīng)常需要查看一個事務(wù)產(chǎn)生了哪些鎖,哪個事務(wù)被哪個事務(wù)阻塞了,若執(zhí)行一條SQL語句時阻塞住了,需要查詢?yōu)槭裁醋枞?,是誰阻塞住的,這些信息可以通過查詢系統(tǒng)視圖“pg_locks”來得到。pg_locks視圖中各列的描述如下:

列名稱列類型引用描述
locktypetext被鎖定的對象類型:relation、extend、page、tuple、transactionid、virtualxid、object、userlock、advisory
databaseoidpg_database.oid鎖定對象的數(shù)據(jù)庫OID,如果對象是一個共享對象,不屬于任何數(shù)據(jù)庫,此值為“0”,如果對象是“transaction ID”,此值為空
relationoidpg_class.oid如果對象不是表或只是表的一部分,則此值為“NULL”,否則此值是表的OID
pageinteger表中的頁號,如果對象不是表行(tuple)或表頁(relation page),則此值為“NULL”
tuplesmallint頁內(nèi)的行號(tuple)
virtualxidtext虛擬事務(wù)id
transactionidxid事務(wù)id
classidoidpg_class.oid包含該對象系統(tǒng)目錄的id
objidoidany OID column對象在系統(tǒng)目錄的oid
objsubidsmallint如果對象是表列(table column),此列的值為列號,這時classid和objid指向表
virtualtransactiontext持有或等待這把鎖的虛擬事務(wù)id
pidinteger持有或等待這把鎖的服務(wù)進程的PID,如果此鎖是被一個兩階段提交的事務(wù)持有,則此值為NULL
modetext鎖的模式名稱,如“ACCESS SHARE”“SHARE”“EXCLUSIVE”等鎖模式
grantedboolean如果鎖已被持有,此值為True,如果等待獲得此鎖,則此值為False

上述中,描述事務(wù)id的字段有三個:

  • virtualxid
  • transactionid
  • virtualtransaction
  1. transactionid代表事務(wù)id,簡寫為“xid”
  2. virtualxid代表虛擬事務(wù)id,簡寫為“vxid”
  3. 每產(chǎn)生一個事務(wù)id,都會在pg_clog下的commit log文件中占用2bit
  4. 最早pg中本沒有虛擬事務(wù)id,但是后來發(fā)現(xiàn),有一些事務(wù)根本沒有產(chǎn)生任何實質(zhì)的變更,如一個只讀事務(wù)或一個空事務(wù),若在這種情況下也分配一個事務(wù)id會造成浪費,于是提出了虛擬事務(wù)id的概念
  5. 對于這類只讀事務(wù),值分配一個虛擬事務(wù)id,而不是實際分配一個真實的事務(wù)id,這樣就不需要在commit log中占用2bit的空間了

pg_locks這張視圖的字段分為以下兩部分:

  • virtualtransaction之前的字段(不包括virtualtransaction字段),我們稱其為“第一部分”,用于描述鎖定對象(Locked Object)信息
  • virtualtransaction之后的字段(包括virtualtransaction字段),我們稱其為“第二部分”,用于描述持有鎖或等待鎖的session信息

了解上述概念后,可以容易理解virtualxid和virtualtransaction兩個字段的意思:

  • virtualxid在第一部分字段中,表示鎖對象是一個virtualxid
  • virtualtransaction表示持有鎖或等待鎖session的虛擬事務(wù)id

表鎖實操

1.先開一個psql窗口,命令如下:

image

第一個窗口,查詢PID,并鎖定一張表。

2.第二個窗口中查看數(shù)據(jù)庫中的鎖的情況:

image

sql命令:

select locktype,relation::regclass as rel,virtualxid as vxid,transactionid as xid,virtualtransaction as vxid2,pid,mode,granted from pg_locks where pid = 12264;

通過上述圖片可以看出:

  • 第一行顯示的是事務(wù)在自己的“virtualxid”上加的ExclusiveLock鎖,這是必定會加上的
  • 第二行才是我們實際在表上加的鎖“AccessExclusiveLock”

3.新增一個窗口,顯示地對表加鎖:

image

執(zhí)行sql語句發(fā)現(xiàn),該窗口的鎖表語句會被阻塞住

4.查看兩個進程的鎖情況:

image

  • 發(fā)現(xiàn)兩個進程都對表加了鎖
  • 進程12264中的granted字段為t,說明它獲得了這把鎖
  • 進程21052中的granted字段為f,說明該進程沒有獲得這把鎖,從而被阻塞

行鎖實操

1.第一個窗口執(zhí)行如下操作(在加表鎖的基礎(chǔ)上加行鎖):

image

2.第二個窗口中查看數(shù)據(jù)庫中的鎖的情況:

image

行鎖不僅會在表上加意向鎖,也會在相應(yīng)的主鍵上加意向鎖。其中“jxx_test_pkey”就是表的主鍵。

3.另一個窗口加行鎖:

image

該窗口阻塞

4.第二個窗口中查看數(shù)據(jù)庫中的鎖的情況:

image

xid為739的鎖被進程12264持有了,所以21052的進程獲取鎖標(biāo)識為False

5.如何查看具體是哪一行數(shù)據(jù)被阻塞

-- 其中0和1分別代表pg_locks中的page和tuple字段
select * from jxx_test where ctid = '(0,1)'

pg_locks并不能顯示出每個行鎖的信息,因為行鎖信息并不會被記錄到共享內(nèi)存中。如果記錄到內(nèi)存,意味著對表做全表更新時,表有多少行就需要在內(nèi)存中記錄多少條行鎖信息,那么內(nèi)存會吃不消,所以postgreSQL設(shè)計成不在內(nèi)存中記錄行鎖信息。

思考:如何獲取進程是在哪一行上被阻塞的?

總結(jié)

到此這篇關(guān)于PostgreSQL如何查看事務(wù)所占有的鎖的文章就介紹到這了,更多相關(guān)PostgreSQL查看事務(wù)所占有鎖內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • PostgreSQL拼接字符串的方法

    PostgreSQL拼接字符串的方法

    使用concat()函數(shù)可以合并兩個或多個字符串,這篇文章主要介紹了PostgreSQL拼接字符串的方法,本文通過實例代碼給大家介紹的非常詳細(xì),感興趣的朋友跟隨小編一起看看吧
    2024-05-05
  • 安全高效的PostgreSQL數(shù)據(jù)庫遷移解決方案

    安全高效的PostgreSQL數(shù)據(jù)庫遷移解決方案

    PostgreSQL數(shù)據(jù)庫是一款高度可擴展的開源數(shù)據(jù)庫系統(tǒng),支持復(fù)雜的查詢、事務(wù)完整性和多種數(shù)據(jù)類型由于各種業(yè)務(wù)需求,企業(yè)常常需要將數(shù)據(jù)在不同的云平臺或私有環(huán)境之間遷移,所以本文小編給大家介紹了安全高效的PostgreSQL數(shù)據(jù)庫遷移解決方案,需要的朋友可以參考下
    2023-11-11
  • 在PostgreSQL中實現(xiàn)自增的三種方式

    在PostgreSQL中實現(xiàn)自增的三種方式

    本文介紹了在 PostgreSQL 中創(chuàng)建自增列的三種方法:直接使用序列(sequence)、使用 serial 數(shù)據(jù)類型,以及使用 identity column 語法,文章通過實際示例詳細(xì)講解了每種方法的語法、行為和使用場景,需要的朋友可以參考下
    2026-04-04
  • PostgreSQL配置遠程連接簡單圖文教程

    PostgreSQL配置遠程連接簡單圖文教程

    這篇文章主要給大家介紹了關(guān)于PostgreSQL配置遠程連接的相關(guān)資料,PostgreSQL是一個功能非常強大的關(guān)系型數(shù)據(jù)庫管理系統(tǒng)(RDBMS),文中通過代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2023-12-12
  • Docker環(huán)境下升級PostgreSQL的步驟方法詳解

    Docker環(huán)境下升級PostgreSQL的步驟方法詳解

    這篇文章主要介紹了Docker環(huán)境下升級PostgreSQL的步驟方法詳解,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2021-01-01
  • 如何修改Postgresql默認(rèn)賬號postgres的密碼

    如何修改Postgresql默認(rèn)賬號postgres的密碼

    PostgreSQL數(shù)據(jù)庫創(chuàng)建一個postgres用戶作為數(shù)據(jù)庫的管理員,密碼隨機,所以需要修改密碼,這篇文章主要給大家介紹了關(guān)于如何修改Postgresql默認(rèn)賬號postgres的密碼,需要的朋友可以參考下
    2023-10-10
  • PostgreSQL13基于流復(fù)制搭建后備服務(wù)器的方法

    PostgreSQL13基于流復(fù)制搭建后備服務(wù)器的方法

    這篇文章主要介紹了PostgreSQL13基于流復(fù)制搭建后備服務(wù)器,后備服務(wù)器作為主服務(wù)器的數(shù)據(jù)備份,可以保障數(shù)據(jù)不丟,而且在主服務(wù)器發(fā)生故障后可以提升為主服務(wù)器繼續(xù)提供服務(wù)。需要的朋友可以參考下
    2022-01-01
  • Postgres中UPDATE更新語句源碼分析

    Postgres中UPDATE更新語句源碼分析

    這篇文章主要給大家介紹了關(guān)于Postgres中UPDATE更新語句源碼分析的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2022-03-03
  • postgresql 啟動與停止操作

    postgresql 啟動與停止操作

    這篇文章主要介紹了postgresql 啟動與停止操作,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2021-01-01
  • PostgreSQL教程(十九):SQL語言函數(shù)

    PostgreSQL教程(十九):SQL語言函數(shù)

    這篇文章主要介紹了PostgreSQL教程(十九):SQL語言函數(shù),本文講解了SQL語言函數(shù)基本概念、基本類型、復(fù)合類型、帶輸出參數(shù)的函數(shù)、返回結(jié)果作為表數(shù)據(jù)源等內(nèi)容,需要的朋友可以參考下
    2015-05-05

最新評論

嘉祥县| 安溪县| 太仆寺旗| 科技| 绿春县| 民丰县| 诸暨市| 乌拉特中旗| 从江县| 阜新市| 延庆县| 汉寿县| 南溪县| 营山县| 广德县| 泽州县| 比如县| 宜都市| 乡宁县| 平凉市| 共和县| 疏附县| 开封县| 桦甸市| 万宁市| 谷城县| 咸阳市| 尤溪县| 天镇县| 阿拉尔市| 扶余县| 乐业县| 南靖县| 天台县| 泰顺县| 邯郸县| 黔西| 苍梧县| 内黄县| 兴海县| 牡丹江市|