PostgreSQL10.0preview功能增強-更強可靠性,過去式事務狀態可查(杜絕unknown事務)
標籤
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()獲得事務號)。
Issuing a “multi-statement query”,
e.g. INSERT INTO ...; SELECT txid_current(); if it doesn’t need the result of the prior query;
Combining it with another query,
e.g. INSERT INTO ... RETURNING txid_current();
Using client driver support for batching queries to dispatch the txid_current() query along with other queries without waiting for a reply for each query.
In a future version PostgreSQL may automatically report the transaction ID when it is assigned to make this easier for applications.
例子
SELECT txid_status(BIGINT `63204`);
txid_status的引數是xid, 即txid_current()的返回值型別。
注意不是int32, 是int64哦。
patch如下
Add a txid_status function.
author Robert Haas <rhaas@postgresql.org>
Sat, 25 Mar 2017 00:00:53 +0800 (12:00 -0400)
committer Robert Haas <rhaas@postgresql.org>
Sat, 25 Mar 2017 00:00:53 +0800 (12:00 -0400)
commit 857ee8e391ff6654ef9dcc5dd8b658d7709d0a3c
tree 1d0f54ef032aa0a90bcda70e86ee3850167462ad tree | snapshot
parent 42b4b0b2413b9b472aaf2112a3bbfd80a6ab4dc5 commit | diff
Add a txid_status function.
If your connection to the database server is lost while a COMMIT is
in progress, it may be difficult to figure out whether the COMMIT was
successful or not. This function will tell you, provided that you
don`t wait too long to ask. It may be useful in other situations,
too.
Craig Ringer, reviewed by Simon Riggs and by me
Discussion: http://postgr.es/m/CAMsr+YHQiWNEi0daCTboS40T+V5s_+dst3PYv_8v2wNVH+Xx4g@mail.gmail.com
這個patch的討論,詳見郵件組,本文末尾URL。
PostgreSQL社群的作風非常嚴謹,一個patch可能在郵件組中討論幾個月甚至幾年,根據大家的意見反覆的修正,patch合併到master已經非常成熟,所以PostgreSQL的穩定性也是遠近聞名的。
參考
https://blog.2ndquadrant.com/traceable-commit-postgresql-10/
相關文章
- PostgreSQL10.0preview功能增強-回滾範圍可精細控制(事務、語句級)SQLView
- 分散式事務(2)---強一致性分散式事務解決方案分散式
- 事務狀態持久化持久化
- 分散式事務,強一致性方案有哪些?|分散式事務系列(二)分散式
- spring事務管理原始碼分析(一)配置和事務增強代理的生成流程Spring原始碼
- MongoDB增強事務支援,向NewSQL的方向邁進MongoDBSQL
- spring事務增強,事務回滾如何判斷?希望在前端上有個提示Spring前端
- 長事務強制重啟後一直處於 Fast Recovery 狀態AST
- 宣告式事務能否和程式設計式事務巢狀使用?程式設計巢狀
- PostgreSQL10.0preview功能增強-國際化功能增強,支援ICU(InternationalComponentsforUnicode)SQLViewUnicode
- PostgreSQL10.0preview功能增強-增加ProcArrayGroupUpdate等待事件SQLView事件
- 關於collecting狀態的分散式懸掛事務分散式
- 分散式事務之Spring事務與JMS事務(二)分散式Spring
- 分散式事務(一)—分散式事務的概念分散式
- 儲存過程中巢狀事務儲存過程巢狀
- 使用強大的DBPack處理分散式事務(PHP使用教程)分散式PHP
- PostgreSQL10.0preview功能增強-OLAP增強向量聚集索引(列儲存擴充套件)SQLView索引套件
- pxc 事務pre-commit狀態阻塞MIT
- 分散式事務的一種實現方式--狀態流轉分散式
- PostgreSQL10.0preview功能增強-觸發器函式內建中間表SQLView觸發器函式
- PostgreSQL10.0preview效能增強-hashindexmetapagecache、高併發增強SQLViewIndex
- 分散式事務(3)---RocketMQ實現分散式事務原理分散式MQ
- 分散式事務之資料庫事務與JDBC事務實現(一)分散式資料庫JDBC
- 本地事務和分散式事務的區別分散式
- Python巢狀定義函式增強reduce()函式功能Python巢狀函式
- PostgreSQL10.0preview功能增強-CLOGoldestXID跟蹤SQLViewGo
- Oracle 巢狀事務 VS 自治事務Oracle巢狀
- 強一致性的分散式事務幾種模式對比分散式模式
- 分散式事務(4)---RocketMQ實現分散式事務專案分散式MQ
- 事務使用中如何避免誤用分散式事務分散式
- Spring的事務管理(二)宣告式事務管理Spring
- 分散式事務概述分散式
- 理解分散式事務分散式
- 分散式事務--CAP分散式
- 【ITOO】--分散式事務分散式
- WS分散式事務分散式
- oracle分散式事務Oracle分散式
- 聊聊分散式事務分散式