了解 PostgreSQL 的 MVCC 可見性基本檢查規則

1. 引言

根據 Vadim Mikheev 的說法,PostgreSQL 的多版本并發控制(MVCC)是一種“在多用戶環境中提高數據庫性能的高級技術”。該技術要求系統中存在同一數據元組的多個“版本”,這些版本由不同時間段內獲取的快照進行管理。換句話說,在這種技術下,PostgreSQL 需要根據多個參數(如獲取的快照、當前事務 ID 等)來判斷哪些元組對用戶是“可見”的,哪些是不可見的。這也被稱為 PostgreSQL 的“可見性檢查”規則。在本文中,我將討論可見性檢查的基本原理,幫助您了解 PostgreSQL 內部是如何執行這項任務的,希望這對您的開發工作有所幫助。

2. 涉及的參數

  • 元組本身,包含以下信息:
    • xmin(插入該元組的事務 ID)
    • xmax(如果大于 0,表示刪除該元組的事務 ID;否則表示未被刪除)
    • cid(命令 ID)
    • hintbit(提示位)
  • 全局頂級事務 ID(如果存在)
  • 當前快照,包含 xmin、xmax 和 cid
  • 提交日志數據(CLOG)

3. 檢查過程

3.1 檢查提示位(Hintbit)

可見性檢查過程從檢查提示位(hintbit)開始。如果提示位的狀態為“已提交”(COMMITTED),則可以跳過大部分其他可見性檢查規則以提高效率。對于已提交的元組,PostgreSQL 會獲取該元組的 xmin 值,并與當前快照進行比較,以確保該元組當前未處于“進行中”(in progress)狀態(參見 3.3 節中的公式以確定“進行中”狀態)。這一檢查是必要的,因為即使元組已提交,仍有可能被其他后臺進程在此時更新。如果元組未被其他后臺進程“進行中”,則最后會檢查其 xmax 值以確保它是無效的(即未被刪除)。當上述條件都滿足時,該元組被認為是對用戶可見的。

如果提示位顯示“已中止”(ABORTED),則該元組對用戶不可見。如果提示位沒有值,則 PostgreSQL 會繼續執行后續的可見性檢查規則。

3.2 檢查元組的 xmin 是否等于全局頂級事務 ID

下一個檢查步驟是將元組的 xmin 與全局頂級事務 ID 進行比較,看它們是否相等。全局頂級事務 ID 僅在用戶通過 BEGIN 語句手動啟動事務時才會被設置。如果用戶未以這種方式啟動事務(即未發出 BEGIN 語句),則全局頂級事務 ID 不會被設置,因此此檢查將被跳過。

如果元組的 xmin 等于全局頂級事務 ID,則意味著該元組當前由當前后臺進程(而非其他進程)“進行中”。此時,命令 ID(cid)將用于確定可見性。在事務塊中,發出的每個命令都有一個關聯的命令 ID,用于指示命令的先后順序。例如,如果在一個事務中,SELECT 命令在 UPDATE 命令之后,那么 SELECT 必須看到由之前的 UPDATE 命令更新的新元組,cid 在這一確定中起作用。這種行為還受“隔離級別”(isolation level)的影響,但隔離級別不在本文討論范圍內。默認的隔離級別是“讀已提交”(READ COMMITTED),這使得 SELECT 能看到由之前的 UPDATE 更改的數據;但如果隔離級別設置為“可重復讀”(REPEATABLE READ),則 SELECT 不會看到由之前的 UPDATE 更改的數據。請牢記這一點。

如果元組的 xmin 不等于全局頂級事務 ID,則 PostgreSQL 會繼續執行后續的可見性檢查規則。

3.3 檢查當前快照

下一個檢查步驟是 PostgreSQL 檢查該元組是否被其他后臺進程“進行中”。這是通過將元組的 xmin 值與當前快照的 xmin 和 xmax 值進行比較來完成的,公式如下:

  • 元組 xmin < 快照 xmin:表示未進行中
  • 元組 xmin >= 快照 xmax:表示進行中

如果根據快照判斷該元組為“進行中”,則該元組對當前用戶不可見,因為其他后臺進程仍在處理它。如果元組未被認為“進行中”,則 PostgreSQL 會繼續執行后續的可見性檢查規則。

3.4 檢查提交日志(CLOG)

下一個檢查步驟是 PostgreSQL 獲取元組的 xmin 值,并對照提交日志(CLOG)檢查該元組是否已提交或中止。CLOG 類似于一個事務 ID 數組,每個數組元素存儲一個提交狀態。PostgreSQL 使用公式將事務 ID 轉換為 CLOG 塊加上偏移量,以精確訪問正確的 CLOG 元素。CLOG 數據結構會通過檢查點(checkpoint)進程定期刷新到磁盤,存儲在以下三個目錄中:pg_xactpg_multixactpg_subtrans

如果 CLOG 顯示該元組已提交,PostgreSQL 會繼續檢查元組的 xmax 值以確保它是無效的(即未被刪除)。如果 xmax 無效,則該元組對用戶可見。同時,PostgreSQL 會將該元組的提示位更新為“已提交”(COMMITTED),以便在下次可見性檢查時無需再次訪問 CLOG,因為訪問 CLOG 的成本較高。

如果 CLOG 顯示該元組已中止或無效,則該元組對當前用戶不可見。同時,PostgreSQL 會將該元組的提示位更新為“無效”(INVALID)。

4. 總結

以上是我對 PostgreSQL 中基本可見性規則的理解。當然,還有其他復雜的檢查未在此提及,例如子事務和多事務的處理,但它們的模式與本文提到的內容有些相似。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/919878.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/919878.shtml
英文地址,請注明出處:http://en.pswp.cn/news/919878.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

普通烘箱 vs 鎧德科技防靜電烘箱:深度對比與選擇指南

在電子制造、化工、航空航天等精密工業領域&#xff0c;烘箱作為關鍵工藝設備&#xff0c;其性能直接關系到產品可靠性和生產安全。普通烘箱與防靜電烘箱的核心差異在于靜電防護能力&#xff0c;而鎧德科技作為防靜電烘箱領域的專業廠商&#xff0c;其產品通過技術創新重新定義…

達夢數據庫巡檢常用SQL(一)

達夢數據庫巡檢常用SQL(一) 數據庫基本信息 數據庫用戶信息 數據庫對象檢查 數據庫基本信息 檢查授權信息: SELECT /*+DMDB_CHECK_FLAG*/ LIC_VERSION AS "許可證版本" ,SERIES_NO AS "序列號" ,CHECK_CODE AS "校驗碼" …

TypeScript的接口 (Interfaces)講解

把接口&#xff08;Interface&#xff09;想成一份“說明書”或“合同書”。說明書 比如電飯煲的說明書告訴你&#xff1a; 必須有“煮飯”按鈕必須有“保溫”功能顏色可以是白、黑、紅 接口在 TypeScript 里干的就是同樣的事&#xff1a;它規定一個對象“長什么樣”。 interfa…

Python本源詩話(我DeepSeek)

物理折行新注釋&#xff0c;直抒胸臆吾志名。 筆記模板由python腳本于2025-08-23 13:14:28創建&#xff0c;本篇筆記適合喜歡python和詩的coder翻閱。 學習的細節是歡悅的歷程 博客的核心價值&#xff1a;在于輸出思考與經驗&#xff0c;而不僅僅是知識的簡單復述。 Python官網…

博士招生 | 美國圣地亞哥州立大學 Yifan Zhang 課題組博士招生,AI 安全領域頂尖平臺等你加入!

內容源自“圖靈學術博研社”gongzhonghao學校簡介圣地亞哥州立大學&#xff08;San Diego State University, SDSU&#xff09;是美國加州南部久負盛名的公立研究型大學。學校坐落于科技產業高度活躍的南加州地區&#xff0c;與本地軟件、電信、生物科技、國防及清潔能源等領域…

Day22: Python渦輪增壓計劃:用C擴展榨干最后一絲性能!

目錄&#x1f525; 第一章&#xff1a;初識外掛 - ctypes初體驗1.1 C語言渦輪引擎1.2 Python調用秘籍? 第二章&#xff1a;Cython核彈級加速2.1 給Python穿上防彈衣2.2 編譯倒計時2.3 起飛測試&#x1f3ce;? 第三章&#xff1a;終極速度對決3.1 賽前準備3.2 比賽結果&#x…

如何修復“DNS服務器未響應”錯誤

“DNS服務器未響應”是一種常見的網絡錯誤&#xff0c;當設備無法與域名系統&#xff08;DNS&#xff09;服務器通信以將域名轉換為IP地址時&#xff0c;就會出現這種錯誤。DNS服務器的作用是將域名轉換為IP地址&#xff08;例如&#xff0c;將www.example.com轉換為192.168.1.…

數據結構與算法-算法-三數之和

題目&#xff1a; 15. 三數之和 - 力扣&#xff08;LeetCode&#xff09;15. 三數之和 - 給你一個整數數組 nums &#xff0c;判斷是否存在三元組 [nums[i], nums[j], nums[k]] 滿足 i ! j、i ! k 且 j ! k &#xff0c;同時還滿足 nums[i] nums[j] nums[k] 0 。請你返回所…

ASCOMP PDF Conversa:高效精準的PDF轉換工具

在日常工作和學習中&#xff0c;PDF文件因其格式穩定、兼容性強而被廣泛使用。然而&#xff0c;PDF文件的編輯性較差&#xff0c;常常需要將其轉換為可編輯的格式&#xff0c;如Word文檔。ASCOMP PDF Conversa作為一款功能強大的PDF轉換工具&#xff0c;能夠將PDF文件轉換成可編…

JAVA核心基礎篇-集合

想要了解集合&#xff0c;首先要知道一個東西&#xff0c;叫數據結構。所謂數據結構&#xff0c;其實就是計算機存儲&#xff0c;組織數據的方式。常用的數據結構有8大類數組&#xff0c;鏈表&#xff0c;樹&#xff0c;堆&#xff0c;棧&#xff0c;隊列&#xff0c;哈希表&am…

大模型——深度評測智能體平臺Coze Studio

深度評測智能體平臺Coze Studio 7 月底字節跳動的 Coze-Studio 正式開源,算是 AI 智能體領域的一個大事件。這個月終于有時間在內網環境進行了部署和評測,希望能為團隊的企業知識庫和 AI 應用建設提供多一個選項。 其實,我們廠的知識庫系統一直是自研的。沒有直接采用市面…

UE5打包,LoadObject加載不出網格|動畫

由于筆者UE5加載模型和動畫使用的動態加載&#xff08;LoadObject&#xff09;&#xff0c;而這些資源&#xff08;XX001、XX002 等&#xff09;沒有被任何關卡或藍圖直接引用&#xff0c;在編輯器狀態下是可以正常加載的&#xff0c;但它們在打包時被當作“無用”資源而排除了…

C 語言標準輸入輸出頭文件stdio.h及其常見用法

在這篇文章中&#xff0c;我們來詳細聊一聊 C 語言標準輸入輸出頭文件 stdio.h 及其常見用法。1. stdio.h 是什么 stdio.h&#xff08;Standard Input and Output Header&#xff09;是 C 標準庫中的一個頭文件&#xff0c;提供了處理標準輸入輸出和一些文件操作的函數聲明。 它…

Js逆向 拼夕夕anti_content

前言 本文章中所有內容僅供學習交流使用&#xff0c;不用于其他任何目的&#xff0c;不提供完整代碼&#xff0c;抓包內容、敏感網址、數據接口等均已做脫敏處理&#xff0c;嚴禁用于商業用途和非法用途&#xff0c;否則由此產生的一切后果均與作者無關&#xff01;本文章未經…

大模型時代為什么需要向量數據庫?

這里寫自定義目錄標題1. 向量數據庫2. 向量嵌入3. 特征和向量4. 相似性測量4.1 歐幾里得距離4.2 余弦相似度5. 相似性搜索5.1 K-Means5.2 基于文本嵌入進行意圖匹配6. 問答助手7. 意圖匹配1. 向量數據庫 向量數據庫&#xff08;Vector Database&#xff09;&#xff0c;也叫矢…

【Canvas與旗幟】二十角金盤德國旗

【成圖】【代碼】<!DOCTYPE html> <html lang"utf-8"> <meta http-equiv"Content-Type" content"text/html; charsetutf-8"/> <head><title>多角金盤德國旗 Draft1</title><style type"text/css&qu…

Linux軟件編程:總結

一、Linux系統概述&#xff08;一&#xff09;Linux系統概述&#xff08;二&#xff09;Linux系統簡介1.常見的Linux系統&#xff1f;2.Linux操作系統是操作系統的核心&#xff0c;也成為內核&#xff0c;內核的主要功能&#xff1f;3.shell是操作系統的外殼&#xff0c;主要作…

【51單片機學習】直流電機驅動(PWM)、AD/DA、紅外遙控(外部中斷)

一、直流電機驅動&#xff08;PWM&#xff09;1.直流電機介紹步進電機的旋轉速度完全由編碼的通電時間決定的&#xff0c;可以用于精密控制。 舵機內部是一個直流電機加一個控制器&#xff0c;引出三根線&#xff0c;分別是正負極和編碼線&#xff0c;根據輸出電平的時間來控制…

ComfyUI Portrait Master肖像大師中文版

本文轉載自&#xff1a;ComfyUI Portrait Master肖像大師中文版 - Hello123工具導航 ** 一、產品定位與技術架構 肖像大師中文版是專為 AI 繪畫工具設計的提示詞生成插件&#xff0c;通過結構化參數控制實現精準人物肖像生成。它基于 ComfyUI 平臺開發&#xff0c;提供 193 國…

(Redis)內存淘汰策略

1. 為什么需要內存淘汰策略&#xff1f;Redis 是一個基于內存的高性能數據庫&#xff0c;所有數據都存儲在內存中。優點&#xff1a;讀寫速度極快。缺點&#xff1a;內存有限&#xff0c;存滿之后如果繼續寫入&#xff0c;就必須有一套策略來決定“刪掉誰&#xff0c;留下誰”。…