溫馨提示×

溫馨提示×

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

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

PostgreSQL Locks的基礎知識有哪些

發(fā)布時間:2021-11-08 16:53:01 來源:億速云 閱讀:252 作者:iii 欄目:關系型數(shù)據(jù)庫

這篇文章主要介紹“PostgreSQL Locks的基礎知識有哪些”,在日常操作中,相信很多人在PostgreSQL Locks的基礎知識有哪些問題上存在疑惑,小編查閱了各式資料,整理出簡單好用的操作方法,希望對大家解答”PostgreSQL Locks的基礎知識有哪些”的疑惑有所幫助!接下來,請跟著小編一起來學習吧!

PostgreSQL把鎖分為三類,table-level, row-level and advisory locks.Table和Row級鎖可以是顯式或隱式鎖,advisory locks通常是顯式鎖.顯式鎖在顯式用戶請求時獲得,而隱式鎖則通過標準SQL命令獲得.

Advisory Locks
PG提供了應用自定義的locks,這種locks稱為Advisory Locks — 系統(tǒng)并沒有強制使用這些鎖,由應用自行正確使用.
有兩種方法請求獲取advisory lock : Session Level和Transaction Level.
session level : 一旦在session level獲取了鎖,除非session終止或者顯式的釋放,否則鎖會一直持有.不同于標準的鎖請求,session level的advisory lock不需要遵守事務語義:在事務期間申請的lock會在rollback后仍會持有,同時就算事務調(diào)用失敗unlock也是有效的.lock可以多次獲取,對于每一次完整的鎖請求必須在釋放鎖前有相應的unlock.
transaction level : 與普通鎖類似,在事務結(jié)束時自動釋放,沒有顯式的unlock操作.
對于同一個Advisory Lock,如果同時請求session leve和transaction level的鎖,那么會以期望的方式阻塞.
下面是Advisory Lock的例子:

session 1

[local]:5432 pg12@testdb=# -- Transaction 1
[local]:5432 pg12@testdb=# BEGIN;
BEGIN
Time: 0.882 ms
[local]:5432 pg12@testdb=#* 
[local]:5432 pg12@testdb=#* SELECT pg_advisory_xact_lock(1);
 pg_advisory_xact_lock 
-----------------------
(1 row)
Time: 2.449 ms
[local]:5432 pg12@testdb=#* -- Some work here
[local]:5432 pg12@testdb=#*

session 2

[local]:5432 pg12@testdb=# -- Transaction 2
[local]:5432 pg12@testdb=# BEGIN;
BEGIN
Time: 0.468 ms
[local]:5432 pg12@testdb=#* 
[local]:5432 pg12@testdb=#* SELECT pg_advisory_xact_lock(1);

session 3

[local]:5432 pg12@testdb=# SELECT * FROM pg_locks where pid <> pg_backend_pid();
  locktype  | database | relation | page | tuple | virtualxid | transactionid | classid | objid | objsubid | virtualtransaction | pid  |     mode      | granted | fastpath 
------------+----------+----------+------+-------+------------+---------------+---------+-------+----------+--------------------+------+---------------+---------+----------
 virtualxid |          |          |      |       | 5/4        |               |         |       |          | 5/4                | 1789 | ExclusiveLock | t       | t
 virtualxid |          |          |      |       | 4/13       |               |         |       |          | 4/13               | 1787 | ExclusiveLock | t       | t
 advisory   |    16384 |          |      |       |            |               |       0 |     1 |        1 | 5/4                | 1789 | ExclusiveLock | t       | f
 advisory   |    16384 |          |      |       |            |               |       0 |     1 |        1 | 4/13               | 1787 | ExclusiveLock | f       | f
(4 rows)
Time: 3.748 ms

通過查詢pg_locks,可以看到pid 1789持有advisory lock(granted = t),而pid 1787在等待該鎖(granted = f).

到此,關于“PostgreSQL Locks的基礎知識有哪些”的學習就結(jié)束了,希望能夠解決大家的疑惑。理論與實踐的搭配能更好的幫助大家學習,快去試試吧!若想繼續(xù)學習更多相關知識,請繼續(xù)關注億速云網(wǎng)站,小編會繼續(xù)努力為大家?guī)砀鄬嵱玫奈恼拢?/p>

向AI問一下細節(jié)

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

AI