您好,登錄后才能下訂單哦!
這篇文章主要介紹“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 — 系統并沒有強制使用這些鎖,由應用自行正確使用.
有兩種方法請求獲取advisory lock : Session Level和Transaction Level.
session level : 一旦在session level獲取了鎖,除非session終止或者顯式的釋放,否則鎖會一直持有.不同于標準的鎖請求,session level的advisory lock不需要遵守事務語義:在事務期間申請的lock會在rollback后仍會持有,同時就算事務調用失敗unlock也是有效的.lock可以多次獲取,對于每一次完整的鎖請求必須在釋放鎖前有相應的unlock.
transaction level : 與普通鎖類似,在事務結束時自動釋放,沒有顯式的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的基礎知識有哪些”的學習就結束了,希望能夠解決大家的疑惑。理論與實踐的搭配能更好的幫助大家學習,快去試試吧!若想繼續學習更多相關知識,請繼續關注億速云網站,小編會繼續努力為大家帶來更多實用的文章!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。