支援的版本:目前 (17) / 16
開發版本:devel

66.3. 子交易 #

子交易在交易內部啟動,允許將大型交易分解為較小的單元。子交易可以提交或中止,而不會影響其父交易,允許父交易繼續。 這樣可以更輕鬆地處理錯誤,這是一種常見的應用程式開發模式。 子交易一詞通常縮寫為 subxact

子交易可以使用 SAVEPOINT 命令顯式啟動,但也可以通過其他方式啟動,例如 PL/pgSQL 的 EXCEPTION 子句。 PL/Python 和 PL/Tcl 也支援顯式子交易。 子交易也可以從其他子交易啟動。 頂層交易及其子子交易形成一個層次結構或樹,這就是我們將主交易稱為頂層交易的原因。

如果子交易被分配一個非虛擬交易 ID,則其交易 ID 被稱為 subxid。 唯讀子交易不會被分配 subxid,但一旦它們嘗試寫入,就會被分配一個。 這也會導致所有子交易的父項(包括頂層交易)都被分配非虛擬交易 ID。 我們確保父 xid 始終小於其任何子 subxid。

每個 subxid 的直接父 xid 記錄在 pg_subtrans 目錄中。 頂層 xid 不會建立條目,因為它們沒有父項,也不會為唯讀子交易建立條目。

當子交易提交時,所有已提交且具有 subxid 的子子交易也將被視為在該交易中已子提交。 當子交易中止時,其所有子子交易也將被視為已中止。

當具有 xid 的頂層交易提交時,其所有已子提交的子子交易也會被永久記錄為已提交在 pg_xact 子目錄中。 如果頂層交易中止,則其所有子交易也會中止,即使它們已子提交。

每個交易保持開啟(未回滾或釋放)的子交易越多,交易管理開銷就越大。 每個後端在共享記憶體中最多緩存 64 個開啟的 subxid; 在那之後,由於需要額外查詢 pg_subtrans 中的 subxid 條目,因此儲存 I/O 開銷顯著增加。

提交更正

如果您在文件中發現任何不正確、與您使用特定功能的經驗不符或需要進一步澄清的地方,請使用 此表單 來回報文件問題。