2019年1月2日 星期三

idle in transaction

在 PostgreSQL 中,如果因為某些因素必須要關閉部份的 transaction,需要判斷一個 transaction 是否可以被安全地關閉。這時可以從 pg_stat_activity 裡面觀察 transaction 的狀態,主要觀察的對象是兩個參數:backend_xidbackend_xmin。比較詳細的描述可以參考 [1]。

從 [1] 的說明來看,PostgreSQL 只有在 transaction 需要寫入資料時,才會要求要取得 transaction ID(即 backend_xid),因此第一個判斷準則就是~如果 transaction 沒有 backend_xid,表示雖然不能保證它沒有在讀取資料,但可以肯定它沒有在寫入資料。

其次,由於 MVCC 的架構中,Read Committed 模式的 snapshot 是每次 query 開始執行時都會重新取得,因此如果對於一個 Read Committed 模式的 transaction 看到它的參數 backend_xmin 沒有值,表示它甚至也沒有在讀取資料,這種 transaction 就可以完全安全地被關閉了。但如果是 Repeatable Read 模式以上的交易,因為在 transaction 開始的第一個 query 時就會取得 snapshot,因此多半 backend_xmin 會有值。(如果 Repeatable Read 的 transaction 在 backend_xmin 也沒有值,就表示它的交易開始以後從來沒執行過任何 query……..)

參考資料
  1. PostgreSQL 如何判断idle in transaction的事务中有没有东西要提交
  2. 28.2. The Statistics Collector
  3. Idle In Transaction Problem

沒有留言: