一次性全講透GaussDB(DWS)鎖的問題

来源:https://www.cnblogs.com/huaweiyun/archive/2023/09/13/17699720.html
-Advertisement-
Play Games

本文分享自華為雲社區《GaussDB(DWS)鎖問題全解》,作者: yd_211043076。 一、gaussdb有哪些鎖 1、常規鎖:常規鎖主要用於業務訪問資料庫對象的加鎖,保護併發操作的對象,保持數據一致性;常見的常規鎖有表鎖(relation)和行鎖(tuple)。 表鎖:當對錶進行DDL、D ...


本文分享自華為雲社區《GaussDB(DWS)鎖問題全解》,作者: yd_211043076。

一、gaussdb有哪些鎖

1、常規鎖:常規鎖主要用於業務訪問資料庫對象的加鎖,保護併發操作的對象,保持數據一致性;常見的常規鎖有表鎖(relation)和行鎖(tuple)。

表鎖:當對錶進行DDL、DML操作時,會對操作的對象表加鎖,在事務結束釋放。

行鎖:使用select for share語句時持有該模式鎖,後臺會對tuple加5級鎖;使用select for update, delete, update等操作時,後臺會對tuple加7級鎖(ExclusiveLock)。

2、輕量級鎖:輕量級鎖主要用於資料庫內部共用資源訪問的保護,比如記憶體結構、共用記憶體分配控制等。

二、鎖衝突矩陣

1、常規鎖按照粒度可分為8個等級,各操作對應的鎖等級及鎖衝突情況參照下表:

鎖編號

鎖模式

對應操作

衝突的鎖編號

1

ACCESS SHARE

SELECT

8

2

ROW SHARE

SELECT FOR UPDATE、SELECT FOR SHARE

7,8

3

ROW EXCLUSIVE

INSERT、DELETE、UPDATE

5,6,7,8

4

SHARE UPDATE EXCLUSIVE

VACUUM、ANALYZE

4,5,6,7,8

5

SHARE

CREATE INDEX

3,4,6,7,8

6

SHARE ROW EXCLUSIVE

-

3,4,5,6,7,8

7

EXCLUSIVE

-

2,3,4,5,6,7,8

8

ACCESS EXCLUSIVE

DROP TABLE、ALTER TABLE、REINDEX、CLUSTER、VACUUM FULL、TRUNCATE

1,2,3,4,5,6,7,8

2、幾種鎖衝突的場景:

ACCESS SHARE與ACCESS EXCLUSIVE鎖衝突例子:session 1 在事務內對錶進行truncate,且lockwait_timeout參數設置為10s;session 2 查詢該表,此時會一直等到session 1 釋放鎖,直到等鎖超時。

cke_132.png

cke_133.png

ROW SHARE(行鎖衝突的例子):併發insert/update/copy;session 1在事務內對有主鍵約束的行存表進行更新;session 2對同一主鍵的行進行更新,會一直等待session 1釋放鎖,直到行鎖超時;

cke_134.png

cke_135.png

併發更新列存表出現等鎖超時,該現象一般為併發更新同一CU造成的;

cke_136.png

場景構造:session 1在事務內對列存表進行更新,不提交事務;session 2同樣對列存表更新,會等鎖超時;(只有更新的為同一CU時才會出現此場景)

列存表併發等鎖原理:https://bbs.huaweicloud.com/blogs/255895 

三、鎖相關視圖

pg_locks視圖存儲各打開事務所持有的鎖信息,需關註的欄位:locktype(被鎖定對象的類型)、relation(被鎖定對象關係的OID)、pid(持鎖或等鎖的線程ID)、mode(持鎖或等鎖模式)、granted(t:持鎖,f:等鎖)。

cke_137.png

pgxc_lock_conflicts視圖提供集群中有衝突的鎖的信息(適合鎖衝突現場還在是使用),目前只收集locktype為relation、partition、page、tuple和transactionid的鎖的信息,需要關註的欄位nodename(被鎖定對象節點的名字)、queryid(申請鎖的查詢ID)、query(申請鎖的查詢語句)、pid、mode、granted。

pgxc_deadlock視圖獲取導致分散式死鎖產生的鎖等待信息,只收集locktype為relation、partition、page、tuple和transactionid的鎖等待信息。

四、鎖相關參數介紹

lockwait_timeout:控制單個鎖的最長等待時間。當申請的鎖等待時間超過設定值時,系統會報錯,即等鎖超時,一般預設值為20min。

deadlock_timeout:死鎖檢測的超時時間,當申請的鎖超過該設定值仍未獲取到時,觸發死鎖檢測,系統會檢查是否產生死鎖,一般預設值為1s。

update_lockwait_timeout:允許併發更新參數開啟時,控制併發更新同一行單個鎖的最長等待時間,超過該設定值,會報錯,一般預設值為2min。

以上參數的單位均為毫秒,請保證deadlock_timeout的值大於lockwait_timeout,否則將不會觸發死鎖檢測。

五、鎖等待超時排查

https://bbs.huaweicloud.com/blogs/280354

六、為什麼會死鎖(單節點死鎖)

1、死鎖:兩個及以上不同的進程實體在運行時因為競爭資源而陷入僵局,除非外力作用,否則雙發都無法繼續推進;而資料庫事務可針對資源按照任意順序加鎖,就有一定幾率因不同的加鎖順序而產生死鎖。

2、死鎖場景模擬:

鎖表順序不同,常見於存儲過程中

session 1

session 2

begin;

begin;

truncate table lock_table2;

truncate table lock_table1;

select * from lock_table1;

select * from lock_table2;

第一時刻:session 1:先拿到lock_table2的8級鎖,此時session 2拿到lock_table1的8級鎖;第二時刻:session 1:再嘗試申請lock_table1的1級鎖; session 2 :嘗試申請lock_table2的1級鎖;兩個會話都持鎖並等待對方手裡的鎖釋放。

GaussDB(DWS)會自動處理單點死鎖,當單節點死鎖發生時,資料庫會自動回滾其中一條事務,以消除死鎖現象。

cke_138.png

3、一些死鎖場景

vacuum full 與delete select語句造成的死鎖(等同一對象的不同鎖);部分業務場景下,存在查詢時間窗在白天,而業務跑批刪除只能在晚上執行,同樣為了保證查詢效率降低臟頁率,對業務表的vacuum full操作也在晚上,時間窗重合,升鎖過程便可能產生死鎖;

cke_139.png

上述場景下vacuum full語句申請1:ExclusiveLock並持有,後續delete from語句申請2:cessShareLock並持有;vacuum full升級鎖3:AccessExclusiveLock失敗;delete from升級鎖4:RowExclusiveLock失敗;兩個語句形成死鎖。

cke_140.jpeg

ater列存表與select max(a)的死鎖,兩條語句只涉及一張表,但仍舊會產生死鎖,列存表有CUdesc表及delta表,語句在行時拿鎖順序不同,便可能產生死鎖

cke_141.png

列存表查詢max(col)時,儘管並沒有開啟delta表,也會獲取delta表的鎖,alter table也一樣,此時同一個操作對象變存在兩個獨立的資源(主表與delta表,其實還應該包含CUdesc表),不同拿鎖順序變產生這種兩個語句操作同一張表死鎖的現象。

cke_142.jpeg

upsert的死鎖現象:行存帶主鍵約束或列存表場景下併發upsert,併發更新重覆的數據,且不同事務內部更新的相同數據的順序不同;cke_143.png

該場景主要為分別從兩個數據源做併發導數(upsert方式)時,時間窗未區分開,且數據也存在重覆的可能性,此時便可能存在以不同的順序分別更新相同數據(行)的現象,就會引發死鎖現象,導致某一次導數任務失敗,可選擇業務側將兩個任務區分到不同時間窗去執行來規避該死鎖現象。

cke_144.jpeg

七、分散式死鎖

DWS的share nothing結構,使得一條語句可能在不同的節點上執行,在這些節點上都要對操作對象申請鎖,且同樣存在以不同順序申請鎖的可能,因此便存在分散式死鎖的場景

1、如何排查分散式死鎖:

先構造一個分散式死鎖場景,如下圖,session 1 在CN 1上開啟事務並先查詢lock_table1;此時session 2在CN 2上開啟事務並查詢lock_table1,然後兩個會話分別執行truncate表:

session 1-CN 1

session 2-CN 2

begin;

begin;

select * from lock_table1;

select * from lock_table1;

truncate table lock_table1;

truncate table lock_table1;

通過查詢分散式死鎖視圖:select * from pgxc_deadlock order by nodename,dbname,locktype,nspname,relname;

cke_145.png

根據查詢結果,可以看出在構造的該場景下:

cke_146.png

CN_5001的truncate語句線程號為:139887210493696;在等待線程號為:139887432832768的truncate語句釋放lock_table1的AccessShareLock(事務中select語句持有的鎖),同時該線程:139887210493696,持有lock_table1的AccessExclusiveLock;

cke_147.jpeg

CN_5004的truncate語句線程號為:139887432832768;在等待線程號為:139887210493696的truncate語句釋放lock_table1的AccessExclusiveLock;同時該線程:139887432832768持有lock_table1的AccessShareLock;這種 場景下在不同實例上分散式的等待關係,便形成了分散式死鎖。

2、消除分散式死鎖:

對於分散式死鎖的場景,一般在一個事務因為等鎖超時後事務回滾,另一個未超時的事務便能繼續進行下去;人為干預的情況,則需要調用select pg_terminate_backend(pid),查殺掉一個持鎖語句,破壞環形等待條件,便可讓另一個事務繼續執行下去。

 

點擊關註,第一時間瞭解華為雲新鮮技術~

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • .Net Framework使用Autofac實現依賴註入 前言 最近也是找了快2周的工作了,收到的面試邀請也就幾個,然後有個面試題目是用asp.net mvc + Entityframework 做一個學生信息增刪改查系統。因為題目要求了用Entityframework 也就是EF 那也就不上co ...
  • Unity 性能優化之Shader分析處理函數ShaderUtil.HasProceduralInstancing: 深入解析與實用案例 點擊封面跳轉到Unity國際版下載頁面 簡介 在Unity中,性能優化是游戲開發過程中非常重要的一環。其中,Shader的優化對於游戲的性能提升起著至關重要的作用 ...
  • 前言 裝飾模式,英文名稱:Decorator Pattern。我第一次看到這個名稱想到的是另外一個詞語“裝修”,我就說說我對“裝修”的理解吧,大家一定要看清楚,是“裝修”,不是“裝飾”。在房子裝修的過程中,各種功能可以相互組合,來增加房子的功用。類似的,如果我們在軟體系統中,要給某個類型或者對象增加 ...
  • 以下內容為本人的學習筆記,如需要轉載,請聲明原文鏈接 微信公眾號「ENG八戒」https://mp.weixin.qq.com/s/zy6Dmo_b3xMPPEO3HNxuuw 有一段時間沒碰條件變數【condition variable】,快忘了它到底是啥。大概記得,之前是用來寫底層介面,輔助實現 ...
  • 目錄docker鏡像倉庫hub.docker.com無法訪問-解決辦法1 個人鏡像站點2 dockerhub為什麼無法訪問2.1 查看dockerhub實際IP2.2 ping檢測3 鏡像加速3.1 使用國內鏡像加速3.1.1 docker配置:3.1.2 containerd配置:3.2 使用博主 ...
  • 先執行 free -h 查看現在的swap分配情況 執行 swapon -s 查看swap的分區文件 執行 swapoff /dev/dm-1 取消已經掛上的swap文件 現在擴充swap到4G,並將swap文件掛到/vm_memory/swapfile上 先創建/vm_memory/swapfil ...
  • 1、背景描述 出於安全考慮,需要禁止使用root用戶通過ssh遠程登錄Linux 禁用root用戶遠程登錄後,需要提供一個許可權用戶用於ssh遠程登錄 2、創建擁有sudo許可權的用戶 2.1、創建一個普通用戶rain useradd命令用於創建一個用戶, 選項 -m 表示創建用戶的主目錄, -c 表示 ...
  • 1. 索引 1.1. 鍵(key) 1.2. 存儲引擎用於快速找到記錄的一種數據結構 1.3. 當表中的數據量越來越大時,索引對性能的影響愈發重要 1.4. 在數據量較小且負載較低時,缺少合適的索引對性能的影響可能還不明顯 1.5. 索引優化是對查詢性能優化最有效的手段 1.6. 索引能夠輕易將查詢 ...
一周排行
    -Advertisement-
    Play Games
  • 示例項目結構 在 Visual Studio 中創建一個 WinForms 應用程式後,項目結構如下所示: MyWinFormsApp/ │ ├───Properties/ │ └───Settings.settings │ ├───bin/ │ ├───Debug/ │ └───Release/ ...
  • [STAThread] 特性用於需要與 COM 組件交互的應用程式,尤其是依賴單線程模型(如 Windows Forms 應用程式)的組件。在 STA 模式下,線程擁有自己的消息迴圈,這對於處理用戶界面和某些 COM 組件是必要的。 [STAThread] static void Main(stri ...
  • 在WinForm中使用全局異常捕獲處理 在WinForm應用程式中,全局異常捕獲是確保程式穩定性的關鍵。通過在Program類的Main方法中設置全局異常處理,可以有效地捕獲並處理未預見的異常,從而避免程式崩潰。 註冊全局異常事件 [STAThread] static void Main() { / ...
  • 前言 給大家推薦一款開源的 Winform 控制項庫,可以幫助我們開發更加美觀、漂亮的 WinForm 界面。 項目介紹 SunnyUI.NET 是一個基於 .NET Framework 4.0+、.NET 6、.NET 7 和 .NET 8 的 WinForm 開源控制項庫,同時也提供了工具類庫、擴展 ...
  • 說明 該文章是屬於OverallAuth2.0系列文章,每周更新一篇該系列文章(從0到1完成系統開發)。 該系統文章,我會儘量說的非常詳細,做到不管新手、老手都能看懂。 說明:OverallAuth2.0 是一個簡單、易懂、功能強大的許可權+可視化流程管理系統。 有興趣的朋友,請關註我吧(*^▽^*) ...
  • 一、下載安裝 1.下載git 必須先下載並安裝git,再TortoiseGit下載安裝 git安裝參考教程:https://blog.csdn.net/mukes/article/details/115693833 2.TortoiseGit下載與安裝 TortoiseGit,Git客戶端,32/6 ...
  • 前言 在項目開發過程中,理解數據結構和演算法如同掌握蓋房子的秘訣。演算法不僅能幫助我們編寫高效、優質的代碼,還能解決項目中遇到的各種難題。 給大家推薦一個支持C#的開源免費、新手友好的數據結構與演算法入門教程:Hello演算法。 項目介紹 《Hello Algo》是一本開源免費、新手友好的數據結構與演算法入門 ...
  • 1.生成單個Proto.bat內容 @rem Copyright 2016, Google Inc. @rem All rights reserved. @rem @rem Redistribution and use in source and binary forms, with or with ...
  • 一:背景 1. 講故事 前段時間有位朋友找到我,說他的窗體程式在客戶這邊出現了卡死,讓我幫忙看下怎麼回事?dump也生成了,既然有dump了那就上 windbg 分析吧。 二:WinDbg 分析 1. 為什麼會卡死 窗體程式的卡死,入口門檻很低,後續往下分析就不一定了,不管怎麼說先用 !clrsta ...
  • 前言 人工智慧時代,人臉識別技術已成為安全驗證、身份識別和用戶交互的關鍵工具。 給大家推薦一款.NET 開源提供了強大的人臉識別 API,工具不僅易於集成,還具備高效處理能力。 本文將介紹一款如何利用這些API,為我們的項目添加智能識別的亮點。 項目介紹 GitHub 上擁有 1.2k 星標的 C# ...