Postgresql

作者如何不阻止 PostgreSql 中的讀取

  • July 24, 2019

既然讀者不阻塞寫者和寫者不阻塞讀者是 MVCC 的全部內容,那麼 postgresql 如何防止正在送出對塊/頁面的更改的寫者阻止讀者讀取這些不一致的數據?

因此,根據我對 PostgreSQL 的 MVCC 的了解,每個表都表示為一個堆文件,每個堆文件包含一個頁面/塊的集合,這些頁面/塊是 8 kb 的資訊段。

所以說兩個事務T1同時T2執行並T1決定對block1. 因此,首先,在記憶體中T1讀取block1並對其進行修改,當最終完成時,它決定送出;即實際上將這些記憶體中的更改寫回block1. 所以我知道xmax它修改的先前條目被設置為,並使用set toid(T1)創建一個新條目。現在我覺得困難的是,比如說當實際的送出過程發生時,比如說讀取(雖然寫入已經開始但沒有結束)。此案如何處理?xmin``id(T1)``T1``T2``T1

任何答案將不勝感激

這就是 MVCC -多版本-並發控制的全部理念。

每當有其他活動事務正在讀取數據或之前已讀取數據時(取決於讀取器事務的隔離級別),數據被修改時,為這些事務預留一個預修改數據的副本,以免阻塞它們。此副本會一直保留到所有這些讀取器事務完成,以便他們可以看到一致的版本。

這是您使用 MVCC 付出的代價,因為伺服器需要維護相同數據的多個副本,而基於鎖(悲觀)的隔離僅使用一個數據副本,但會引入潛在的阻塞。沒有免費的飯菜:-)

您可以在此處閱讀有關它的所有詳細資訊https://www.postgresql.org/docs/11/mvcc.html

我還邀請您參加我關於這個確切主題的複數課程,該課程深入討論了 MVCC 和隔離級別,並附有現實生活中的範例。個人可以獲得1個月的pluralsight免費試用

引用自:https://dba.stackexchange.com/questions/243593