postgresql , 10.0 , 2pc , txid_status , unknown事務
在一些極端情況下,例如當用戶端發出事務送出sql後,用戶端收到資料庫傳回的送出狀态前,如果用戶端崩潰或資料庫異常,導緻用戶端不知道事務的最終狀态到底是送出成功還是失敗的。
那麼怎麼解決這個問題呢?
1. 一種方法是走2pc協定,先使用預送出,然後在發出commit 之前的預送出。(因為隻要預送出成功,就可以認為後面的commit是一定可以成功的),進而來避免unknown的事務問題。
但是2pc引入了性能的問題,因為需要和資料庫互動多次。
2. 10.0引入一個新的功能,檢視以往的事務送出狀态。在發生崩潰問題後,應用程式再起來之後,可以通過事務号,查到事務的送出狀态。杜絕unknown的事務。
為了查詢事務狀态,應用程式必須要保留事務号,目前postgresql通過txid_current()可以查詢目前的事務号,結合insert ,update,... returning txid_current(),可以在一次互動中得到這個事務号。從避免因為這個功能引入的增加一次互動。
未來postgresql可能會在驅動層面解決這個問題,減少業務程式的開發工作量(使用txid_current()獲得事務号)。
例子
patch如下
這個patch的讨論,詳見郵件組,本文末尾url。
postgresql社群的作風非常嚴謹,一個patch可能在郵件組中讨論幾個月甚至幾年,根據大家的意見反複的修正,patch合并到master已經非常成熟,是以postgresql的穩定性也是遠近聞名的。
<a href="https://git.postgresql.org/gitweb/?p=postgresql.git;a=commit;h=857ee8e391ff6654ef9dcc5dd8b658d7709d0a3c">https://git.postgresql.org/gitweb/?p=postgresql.git;a=commit;h=857ee8e391ff6654ef9dcc5dd8b658d7709d0a3c</a>
<a href="https://blog.2ndquadrant.com/traceable-commit-postgresql-10/">https://blog.2ndquadrant.com/traceable-commit-postgresql-10/</a>