真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網(wǎng)站制作重慶分公司

PostgreSQLMVCC源碼的示例分析

這篇文章主要為大家展示了“PostgreSQL MVCC源碼的示例分析”,內(nèi)容簡而易懂,條理清晰,希望能夠幫助大家解決疑惑,下面讓小編帶領(lǐng)大家一起研究并學(xué)習(xí)一下“PostgreSQL MVCC源碼的示例分析”這篇文章吧。

創(chuàng)新互聯(lián)公司專注于利通企業(yè)網(wǎng)站建設(shè),成都響應(yīng)式網(wǎng)站建設(shè)公司,成都做商城網(wǎng)站。利通網(wǎng)站建設(shè)公司,為利通等地區(qū)提供建站服務(wù)。全流程按需網(wǎng)站設(shè)計,專業(yè)設(shè)計,全程項目跟蹤,創(chuàng)新互聯(lián)公司專業(yè)和態(tài)度為您提供的服務(wù)

      MVCC對每一個DBA來講,都不陌生,即多版本控制(Multi-Version-Control)。正因為數(shù)據(jù)有了多個版本,才實現(xiàn)了讀和寫在一定程度上的分離,提高數(shù)據(jù)庫每秒處理查詢的能力(QPS)。

用戶發(fā)起的普通查詢請求(不包含select … for update語句),并不堵塞DML事務(wù)。在Read Commit事務(wù)隔離級別時,查詢請求只讀取查詢請求之前已經(jīng)提交的事務(wù)的數(shù)據(jù)更改,對當(dāng)前版本的數(shù)據(jù)并不影響;

而DML語句,會操作當(dāng)前版本。因此做到了讀寫分離的目的,提高數(shù)據(jù)庫并發(fā)能力。

      不同的數(shù)據(jù)庫,實現(xiàn)MVCC的方法不同。Oracle和MySQL Innodb 存儲引擎類似的使用undo來實現(xiàn)。

      對于PostgreSQL數(shù)據(jù)庫來講,他沒有undo,那么,PG又是怎么來實現(xiàn)他自己的MVCC呢?又有那些優(yōu)缺點呢?

     PG用copy tuple和tuple的xmin,xmax,cmin,cmax等標(biāo)記來實現(xiàn)多版本。

     xmin:在創(chuàng)建記錄(tuple)時,記錄此時,后面每次update也會更新。

     xmax: 在刪除tuple或者lock時,記錄此時;如果記錄沒有被刪除,那么此時為0。

     cmin和cmax:主要為標(biāo)識在同一個事務(wù)中多個語句命令的序列值。用于同一個事務(wù)中實現(xiàn)版本可見性判斷。

1.下面我們先來看一下xmin和xmax的變化:

PostgreSQL MVCC源碼的示例分析

從上圖可以看出,4條記錄的xmin是一樣的,都是“390689”,這說明是在同一個事務(wù)中創(chuàng)建的。另外xmax都為“0”,說明都沒有被刪除。cmin和cmax都是1,說明是同一個命令創(chuàng)建的。

接下來,我們update一下id為1的記錄,看發(fā)生什么情況:

update之后,并沒有提交,重新開起另外一個窗口,查詢:

PostgreSQL MVCC源碼的示例分析

我們看到,ID為1的記錄,只有xmin沒有變化,其它三個值都發(fā)生了變化,其中xmax變成了”390691”。

然后我把事務(wù)提交掉,再在新窗口中查詢:

PostgreSQL MVCC源碼的示例分析

我們看到,提交后,ID 為1的記錄,xmin變?yōu)椤?90691”,xmin增加了1;而xmax變成了0。

從上面的案例中,我們從表面上可以看出,xmin增加了。但是事實上,PostgreSQL在底層所做的事情,遠(yuǎn)比這個要多。底層已經(jīng)生成了一個新版本的tuple,新版本tuple的xmin等于老版本的xmax。

詳細(xì)的internal,我后面再展開講。

2.我們再來看一下cmin和cmax的變化:

我起一個事務(wù),包含兩條update,一條update ID值為2的記錄,一條insert ID值為3的記錄:

PostgreSQL MVCC源碼的示例分析

事務(wù)“390694”中,cmin和cmax的值,依次遞增。從目前來看cmin和cmax實際上是同一個field。

源碼定義如下,用union實現(xiàn)了CommandId,是一個combo command id。

PostgreSQL MVCC源碼的示例分析

因此,從上面的例子來看,PostgreSQL的mvcc實現(xiàn)是比較簡單的。只需要通過對比tuple header中xmin,xmax,cmin,cmax與當(dāng)前的xid,就可以得到在scan tuple時,此tuple對于當(dāng)前查詢的可視性。

可見性判斷邏輯:

PostgreSQL MVCC源碼的示例分析

但是也帶來了另外一個問題:就是在沒有undo的情況下,會導(dǎo)致空間的增長。因此PostgreSQL引入了vacumm后臺進(jìn)程,來定期清理這些 DEAD tuple。

以上是“PostgreSQL MVCC源碼的示例分析”這篇文章的所有內(nèi)容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內(nèi)容對大家有所幫助,如果還想學(xué)習(xí)更多知識,歡迎關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道!


分享題目:PostgreSQLMVCC源碼的示例分析
當(dāng)前地址:http://weahome.cn/article/jggghc.html

其他資訊

在線咨詢

微信咨詢

電話咨詢

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部