一次性全講透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
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...