中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

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

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

PostgreSQ數據庫中有沒有PAGE鎖 與Advisory Locks

發布時間:2021-11-26 09:13:19 來源:億速云 閱讀:91 作者:小新 欄目:大數據

這篇文章將為大家詳細講解有關PostgreSQ數據庫中有沒有PAGE鎖 與Advisory Locks,小編覺得挺實用的,因此分享給大家做個參考,希望大家閱讀完這篇文章后可以有所收獲。

事情的起因是,之前寫了一篇比較MYSQL 和 PG 的MVCC的文字,其中提到PG 沒有 PAGE LOCK,有同學指正,提出PG是有 PAGE LOCK 的。

到底PG 有沒有 PAGE LOCK 個人覺得的搞搞清楚,并且有錯必改,也感謝給我指正的 “燦” 同學。

1 首先最直觀的方式就是官方文檔

https://www.postgresql.org/docs/12/explicit-locking.html

PostgreSQ數據庫中有沒有PAGE鎖 與Advisory Locks

但問題可能有同學提出在PG 9.3 以及以前的版本中并未看到,單獨列出的 page level locks 這個單獨的項目,但實際仔細的查找之前的版本的 page level locks 是在 Row-level locks 這個項目中,并且從早期的9.x寫到現在的PG12 都是一句話帶過

PostgreSQ數據庫中有沒有PAGE鎖 與Advisory Locks

和有些數據庫對PAGE LOCKS 的詳細描述和功能性的描述(對比SQL SERVER),PG 對PAGE LOCKS 描述有點簡單。

 既然想從文檔中探究秘密的想法無法達成,只能看看源代碼里面能不能有點收獲 lock.h 文件中有相關鎖的定義和處理的方式,打開文件

PostgreSQ數據庫中有沒有PAGE鎖 與Advisory Locks

PostgreSQ數據庫中有沒有PAGE鎖 與Advisory Locks

PostgreSQ數據庫中有沒有PAGE鎖 與Advisory Locks

相關的使用locktage_page 鎖的例子,可以在src/backend/access/gin/ginfast.c:               

LockPage(index,GIN_METAPAGE_BLKNO, ExclusiveLock)

中找到相關使用locktage_page 的程序段

PostgreSQ數據庫中有沒有PAGE鎖 與Advisory Locks

應該還有其他的PAGE 鎖,但限于時間和經歷的限制,沒有繼續再找,如果還有其他的還請高手不吝賜教,感謝。

實際上在上一篇中給出一句PG 沒有PAGE 鎖,這個的確是不正確的,這里也說說我理解的PAGE 鎖的含義是什么,為什么說了那樣一句話。

先用一個圖來看一下SQL SERVER 的PAGE LOCK 和 ROW LOCK  , TABLE LOCK 的關系

PostgreSQ數據庫中有沒有PAGE鎖 與Advisory Locks

SQL SERVER 與其他數據庫不一樣的地方,在于資源的動態鎖定,也就是他可能一開始使用了ROW 鎖, 但由于后期整體操作的復雜度提高,直接將ROW 鎖升級為頁鎖, 而其他的數據庫目前我是沒有聽到有確認的一種叫法 Lock escalation.

PostgreSQ數據庫中有沒有PAGE鎖 與Advisory Locks

另外SQL SERVER 在行鎖和頁鎖中,是可以將其進行 enabled 和 disabled的,這點相對于其他數據庫的方面還是靈活的。

所以可能如果從之前理解的一些頁鎖的概念和使用的方式來說, PG的頁鎖是不可隨意控制,從應用程序developer角度也無需深刻理解的。

PostgreSQ數據庫中有沒有PAGE鎖 與Advisory Locks

反觀SQL SERVER 如果程序員在處理一些應用的過程中,建議還是考慮一下鎖升級的問題,因為鎖升級必然導致更多的鎖沖突。

回過頭來在看PG 的Advisory Locks ,下面通過兩個例子來說明advisory locks 的作用。因為其他的數據庫沒有這樣的設定(如果有還請指正,至少沒MYSQL , SQL SERVER 是沒有的)

1  SESSION 下面我們找兩個SESSION   SESSION 1  SESSION 2 

SESSION 1

PostgreSQ數據庫中有沒有PAGE鎖 與Advisory Locks

SESSION 2 

PostgreSQ數據庫中有沒有PAGE鎖 與Advisory Locks

從上面的例子中可以領會到Advisory Locks 具體的功能,首先在MVCC 無法解決應用關于數據處理的次序性和數據的唯一性的情況下通過Advisory Locks在應用程序中使用,通過SESSION 級別 或者 transcation 級別通過Advisory Locks來達到某種特殊的需求。

如上面的例子中,SESSION 1  插入數據, 但SESSION 2 需要刪除 ID =1 的數據,但問題是怎么判斷 SESSION1中的數據表中已經存在了 數據,如果是其他的數據庫可能需要其他手段,例如在表中設置狀態位的邏輯方式來不斷進行判斷,但實際上這就產生了鎖,任何對數據庫中的表的操作都會產生鎖,這就造成了數據庫的資源的爭奪,在頻繁的獲取狀態的情況或修改狀態的情況下,就會產生BLOCK 甚至可能會有死鎖。PG 在這方面對于應用是友好的通過Advisory Locks  不會物理的對數據庫產生任何的資源消耗,而是在應用程序中,設置Advisory Locks 來在不同的SESSION 或者 TRANSACTION 中判斷相互的狀態,而采取相對的操作。

下面是一個事務的例子,并發的時候transaction 2,無法獲知到底transaction1到底是不是將ID =4 插入到 TEST 表中,所以通過pg_try_advisory_xact_lock 來阻止 transactoin 2 程序出錯,這也是一種使用advisory_lock的方式。

transaction 1

PostgreSQ數據庫中有沒有PAGE鎖 與Advisory Locks

transaction 2

PostgreSQ數據庫中有沒有PAGE鎖 與Advisory Locks

之所以之前沒有看到有人提到這個所,估計是運維DBA 不關心,因為這與軟件的設計有關,至少要懂得業務的邏輯與程序的設計, 而程序員目前能完全掌握PG的人,估計比DBA 還少,大多都是淺嘗, 所以學習PG 必須深挖"三不管", 讓其為程序設計提供更多的服務方式和使用方式.

關于“PostgreSQ數據庫中有沒有PAGE鎖 與Advisory Locks”這篇文章就分享到這里了,希望以上內容可以對大家有一定的幫助,使各位可以學到更多知識,如果覺得文章不錯,請把它分享出去讓更多的人看到。

向AI問一下細節

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

AI

新郑市| 富平县| 佳木斯市| 大同市| 永宁县| 三亚市| 从江县| 永仁县| 绥芬河市| 改则县| 交口县| 岑溪市| 阿鲁科尔沁旗| 正镶白旗| 峨眉山市| 隆德县| 达拉特旗| 句容市| 天柱县| 乌鲁木齐市| 专栏| 大庆市| 那坡县| 遵义县| 秭归县| 宜宾县| 宁远县| 庆云县| 博野县| 梓潼县| 济阳县| 乐亭县| 思南县| 柳河县| 游戏| 孟津县| 沙湾县| 雷州市| 霍城县| 仪征市| 壤塘县|