Postgresql
作者如何不阻止 PostgreSql 中的讀取
既然讀者不阻塞寫者和寫者不阻塞讀者是 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免費試用。