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

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

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

表級(jí)鎖命令LOCK TABLE

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

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

語(yǔ)法中各項(xiàng)參數(shù)說(shuō)明如下:

  • name:表名
  • lockmode:表級(jí)鎖模式,即SHARE、EXCLUSIVE、ACCESS SHARE、ACCESS EXCLUSIVE、ROW SHARE、ROW EXCLUSIVE、SHARE UPDATE EXCLUSIVE、SHARE ROW EXCLUSIVE
  • NOWAIT:如果沒(méi)有NOWAIT這個(gè)關(guān)鍵字,當(dāng)無(wú)法獲得鎖時(shí)會(huì)一直等待,而如果加了NOWAIT關(guān)鍵字,在無(wú)法立即獲取該鎖時(shí),此命令會(huì)立即退出并且報(bào)錯(cuò)

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

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

行級(jí)鎖命令

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

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

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

鎖的查看

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

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

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

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

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

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

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

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

表鎖實(shí)操

1.先開(kāi)一個(gè)psql窗口,命令如下:

image

第一個(gè)窗口,查詢PID,并鎖定一張表。

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

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;

通過(guò)上述圖片可以看出:

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

3.新增一個(gè)窗口,顯示地對(duì)表加鎖:

image

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

4.查看兩個(gè)進(jìn)程的鎖情況:

image

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

行鎖實(shí)操

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

image

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

image

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

3.另一個(gè)窗口加行鎖:

image

該窗口阻塞

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

image

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

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

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

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

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

總結(jié)

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

相關(guān)文章

  • PostgreSQL拼接字符串的方法

    PostgreSQL拼接字符串的方法

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

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

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

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

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

    PostgreSQL配置遠(yuǎn)程連接簡(jiǎn)單圖文教程

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

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

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

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

    PostgreSQL數(shù)據(jù)庫(kù)創(chuàng)建一個(gè)postgres用戶作為數(shù)據(jù)庫(kù)的管理員,密碼隨機(jī),所以需要修改密碼,這篇文章主要給大家介紹了關(guān)于如何修改Postgresql默認(rèn)賬號(hào)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更新語(yǔ)句源碼分析

    Postgres中UPDATE更新語(yǔ)句源碼分析

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

    postgresql 啟動(dòng)與停止操作

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

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

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

最新評(píng)論

三台县| 德兴市| 平和县| 宝鸡市| 曲靖市| 上林县| 策勒县| 贵德县| 海南省| 武安市| 兰溪市| 顺义区| 通化县| 津市市| 屯留县| 沁水县| 大宁县| 兴城市| 咸宁市| 天津市| 屏东市| 沙雅县| 华池县| 桓台县| 鲁山县| 洪洞县| 华宁县| 石台县| 拜城县| 濉溪县| 萍乡市| 榆社县| 元谋县| 太原市| 恭城| 永新县| 邢台市| 平邑县| 万载县| 元阳县| 博客|