子事務在事務內部啟動,允許將大型事務分解為更小的單元。子事務可以提交或中止,而不會影響其父事務,從而允許父事務繼續執行。這使得錯誤更容易處理,這是一個常見的應用程式開發模式。子事務這個詞通常縮寫為 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 開銷會顯著增加。
如果您在文件中發現任何不正確、與您對特定功能的體驗不符或需要進一步說明的內容,請使用 此表單 報告文件問題。