2025年9月25日: PostgreSQL 18 釋出!
支援的版本: 當前 (18) / 17 / 16
開發版本: devel

67.3. 子事務 #

子事務在事務內部啟動,允許將大型事務分解為更小的單元。子事務可以提交或中止,而不會影響其父事務,從而允許父事務繼續執行。這使得錯誤更容易處理,這是一個常見的應用程式開發模式。子事務這個詞通常縮寫為 subxact

子事務可以使用 SAVEPOINT 命令顯式啟動,但也可以透過其他方式啟動,例如 PL/pgSQL 的 EXCEPTION 子句。PL/Python 和 PL/Tcl 也支援顯式子事務。子事務也可以從其他子事務啟動。頂級事務及其子事務形成一個層級或樹,這就是為什麼我們將主事務稱為頂級事務。

如果子事務被分配了一個非虛擬事務 ID,它的事務 ID 就被稱為 subxid。只讀子事務不分配 subxids,但一旦它們嘗試寫入,就會被分配一個。這也會導致 subxid 的所有父事務,直到幷包括頂級事務,都被分配非虛擬事務 ID。我們確保父 xid 始終低於其任何子 subxids。

每個 subxid 的直接父 xid 都記錄在 pg_subtrans 目錄中。頂級 xid 不會建立條目,因為它們沒有父項,只讀子事務也不會建立條目。

當子事務提交時,它所有已提交的、帶有 subxids 的子事務也將在該事務中被視為已子提交。當子事務中止時,它所有子事務也將被視為中止。

當一個帶有 xid 的頂級事務提交時,它所有已子提交的子事務也會在 pg_xact 子目錄中持久記錄為已提交。如果頂級事務中止,它的所有子事務也將被中止,即使它們已子提交。

每個事務保持開啟狀態(未回滾或釋放)的子事務越多,事務管理的開銷就越大。每個後端在共享記憶體中最多快取 64 個開啟的 subxids;之後,由於在 pg_subtrans 中對 subxid 條目的額外查詢,儲存 I/O 開銷會顯著增加。

提交更正

如果您在文件中發現任何不正確、與您對特定功能的體驗不符或需要進一步說明的內容,請使用 此表單 報告文件問題。