溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點(diǎn)擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

postgresql鎖

發(fā)布時(shí)間:2020-07-20 16:34:14 來源:網(wǎng)絡(luò) 閱讀:6999 作者:一個(gè)笨小孩 欄目:數(shù)據(jù)庫

postgresql鎖:

postgresql中有3種鎖模式,分別為:spinlock、lwlook和regularlock。


1、spinlock自旋鎖

  spinlock使用互斥信息,與操作系統(tǒng)和硬件環(huán)境聯(lián)系比較密切。spinlocky的主要特點(diǎn)是封鎖的時(shí)間很短,沒有等待隊(duì)列和死鎖檢測機(jī)制。事務(wù)結(jié)束時(shí),不能自動(dòng)釋放spinlock鎖。


2、LWLock輕量級(jí)鎖

  LWLock主要提供對共享存儲(chǔ)器的數(shù)據(jù)結(jié)構(gòu)的互斥訪問。LWLock的主要特點(diǎn)是由等待隊(duì)列和無死鎖檢測。事務(wù)結(jié)束時(shí),可以自動(dòng)釋放lwlock。lwlock可分為排他模式和共享模式。

  排他模式:用于數(shù)據(jù)修改操作,例如:insert、update或delete,確保不會(huì)同時(shí)對同一資源進(jìn)行多重更新。

  共享模式:用于讀取數(shù)據(jù)操作,允許多個(gè)事務(wù)讀取相同的數(shù)據(jù),但不允許其他事務(wù)修改當(dāng)前數(shù)據(jù),如select語句。


3、regularlock常規(guī)鎖

 regularlock為一般數(shù)據(jù)庫事務(wù)管理中所指的鎖。regularlock的主要特點(diǎn)為有等待隊(duì)列、有死鎖檢測和能自動(dòng)釋放鎖。

 regularlock支持的鎖的模式有8種,按排他級(jí)別從低到高分別是:access share,row share,row exclusive,share update exclusive,share,share row exclusive,exclusive,access exclusive;

 ①:access share(訪問共享鎖):查詢命令(select)將會(huì)在查詢的表上獲取訪問共享鎖。一般任何一個(gè)對表上的只讀查詢操作都將獲取這種類型的鎖。此模式的鎖和access exclusive(訪問排他鎖)是沖突的。

 ②:row share(行共享鎖):使用“select for update”或“select for share”命令將獲得行共享鎖。另外,此鎖和exclusive(排他鎖)和access exclusive(訪問排他鎖)是沖突的。

 ③:row exclusive(行排他鎖):使用update、delete或insert命令會(huì)在目標(biāo)表上獲得行排他鎖。并且在其他被引用的表上加上access share鎖。一般,更改表數(shù)據(jù)的命令都將在這張表上獲得row exclusive鎖。另外,此鎖和share(共享鎖)、share row exclusive(共享行排他鎖)、exclusive(排他鎖)和access exclusive(訪問排他鎖)是沖突的。

 ④:share update exclusive(共享更新排他鎖):使用vacuum(不帶full選項(xiàng))analyze或create index concurrently語句時(shí)使用共享更新排他鎖。

 ⑤:share(共享鎖):使用create index(不帶concurrently選項(xiàng))語句請求時(shí)用共享鎖。

 ⑥:share row exclusive(共享行排他鎖):和排他鎖類似,但是允許行共享。

 ⑦:exclusive(排他鎖):阻塞行共享和select for update時(shí)使用排他鎖。

 ⑧:access exclusive(訪問排他鎖):alter table,drop table,truncate,reindex,cluster或vacuum full命令會(huì)獲得訪問排他鎖。在lock table命令中,如果沒有生命其他模式,access exclusive就是默認(rèn)模式。


5、死鎖:

  在兩個(gè)或多個(gè)任務(wù)中,如果每個(gè)任務(wù)鎖定了其他任務(wù)視圖鎖定的資源,就會(huì)造成這些任務(wù)永久阻塞,從而出現(xiàn)死鎖。此時(shí)系統(tǒng)處于死鎖狀態(tài)。


形成死鎖的4個(gè)必要條件:

①:請求與保持條件:獲取資源的進(jìn)程可以同時(shí)申請新的資源。

②:非剝奪條件:已經(jīng)分配的資源不能從該進(jìn)程中剝奪。

③:循環(huán)等待條件:多個(gè)進(jìn)程構(gòu)成環(huán)路,并且每個(gè)進(jìn)程都在等待相鄰進(jìn)程正占用的資源。

④:互斥條件:資源只能被一個(gè)進(jìn)程使用。


減少死鎖的方法:

①:在所有事務(wù)中都以相同的次序使用資源。

②:使事務(wù)盡可能簡單并在一個(gè)批處理中。

③:為死鎖超時(shí)參數(shù)設(shè)置一個(gè)合理范圍,如3-30分鐘;超時(shí)則自動(dòng)放棄本操作,避免進(jìn)程掛起。

④:避免在事務(wù)內(nèi)核用戶進(jìn)行交互,減少資源的鎖定時(shí)間。

⑤:使用較低的隔離級(jí)別,相比較高的隔離級(jí)別能夠有效減少持有共享鎖的時(shí)間,減少鎖之間的競爭。


例子:

--:使用命令鎖定一個(gè)表,語法如下:

 lock  [table]  name  [,...] [in lockmode mode] [nowait]

 其中,name為要鎖定的現(xiàn)存表的名字;lockmode為鎖模式,聲明這個(gè)鎖和哪些鎖沖突,如果沒有聲明鎖模式,默認(rèn)為access exclusive模式;nowait聲明lock table不會(huì)等待任何沖突的鎖釋放,如果不得不等待獲取所要求的鎖,就會(huì)推出事務(wù)。

如:lock  table  emp;  或者  lock table a,b;


向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI