淺析postgresql資料庫事務及行鎖特徵

來源:互聯網
上載者:User

標籤:擷取   成功   提交   開啟   安裝使用   pos   欄位   層級   text   

開來源資料庫領域,postgresql以其優越的效能、功能及良好的穩定性排名首位可謂當之無愧,尤其是對高並發的支援可謂匠心獨具。而優越的效能和穩定性,究其根本無非是良好的基礎架構,本文將對其效能和穩定性有著良好支撐的事務及鎖機制進行探討,並結合實際測試,以真切說明和證明其特點。

1、可在事務中的DDL

postgresql中,DDL語句可以在事務中,既可以提交,也可以復原,這在實際工作中,不然具備很大的實際意義,也會給工作帶來方便和安全,如所示:

2、mvcc

postgresql中,很好的實現了mvcc功能,postgresql中mvcc實現了讀寫不阻塞,同時也說明了相同資料行上的寫寫阻塞,如所示:

session1:開始一個事務,事務中insert into t1中一條資料,但不提交,也不會滾,

session2:此時另開一個會話,串連到相同的使用者和資料庫,也insert into t1中同樣的資料行,此時,該事務被阻塞,表現為在該會話中掛住,

session1:在回到session1中,此時發出commit命令,

session2:在回到session2中,此時,因為session1中的相同資料被成功insert並提交,因為t1表c2欄位上有主鍵,因此,session2中的insert into t1事務失敗,並報錯,

 

3、mvcc實現機制

雖然目前的關係庫都實現了mvcc功能,但因為底層架構和設計的因素,有些導致系統穩定性和效能方面的不足。而postgresql中,該功能的實現可謂非常巧妙,這也是postgresql號稱免費版的Oracle的重要因素之一。因為mvcc功能,postgresql中相同資料行的讀寫不阻塞,而寫寫會阻塞和等待。那麼,postgresql中是如何?了mvcc功能的呢?postgresql中,主要通過資料行上的幾個隱含欄位實現了mvcc功能,他們分別是:xmin,amax,cmin,cmax,如所示:

session1:在此會話中,開始一個事務,並在事務中分別update欄位c1=1和delete欄位c1=2的兩個資料行,期間分別查詢t1中每個資料行的資料和隱含欄位:

session2:開啟另一個會話session2,並串連到相同的資料庫和使用者,在session1中delete、update、commit操作後,分別查詢表t1中資料行和幾個隱藏列的值,可以發現:session1中,update資料行前insert的資料行,只填寫了xmin隱藏列的值,並且是當時的xid;update操作時,將舊資料行的xmax填寫為update事務的xid,並重新insert一行新資料,且將新資料行的xmin填寫為當前事務xid,session1中update後查到的資料是新資料行(xmin為當前事務xid),而因為session1中update未提交,session2中查到的資料行為舊資料行(xmin為之前第一次insert時的xid,xmax為當前事務的xid);delete操作時,會將舊資料行的xmax填寫為當前事務的xid,在session1中查詢時,因為已經刪除,已經查不到該資料行,而在session2中,因為session1中的delete操作並未提交,所以看到的是刪除前的資料行,但此時看到舊資料行的xmax已被填寫為session1中事務的xid。session1中提交後,session2中再也看不到舊資料行,只看到了update和delete後的結果,:

這樣postgresql通過資料行的幾個隱藏列巧妙的實現了mvcc功能;而同樣的mvcc功能,oracle雖然實現的很優雅,但需要到undo段中擷取改變向量以重構資料區塊的前影像,這也許會消耗掉一部分系統資源;mysql的innodb中,雖然不需要重構資料區塊前影像,但也需要到undo空間擷取舊的資料行;db2和sql server庫中,雖然也實現了類似mvcc功能,但db2中,通過redo資訊重構資料前影像,這可能會使得redo變得過熱和擁塞,sql server則是將前影像資訊放到了temp資料庫中。postgresql中mvcc的功能雖然實現的巧妙,且在擷取舊資料行的過程中不會消耗太多系統資源,但也存在不同版本資料行都存在資料區段內的情況,當這種舊資料太多時,可能會帶來效能上的問題,清理這些舊資料時,也可能會導致系統負載和效能的抖動或顛簸。

 

4、免費版的Oracle當之無愧

postgresql除了行鎖實現機制外,事務層級和oracle也非常相似,雖然支援四個標準事務層級的設定,但postgresql實際上只支援兩個事務層級:read committed和serializable。此外,postgresql還支援完備的約束,索引,多種語言的函數和過程編碼實現,且為進程模型,幾乎可以在每個流行的平台上安裝使用等,這些特點和功能,足可以說其為免費版的oracle當之無愧。

 

 

 

 

淺析postgresql資料庫事務及行鎖特徵

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.