成人午夜视频全免费观看高清-秋霞福利视频一区二区三区-国产精品久久久久电影小说-亚洲不卡区三一区三区一区

PostgreSQLXID與virtualXID區(qū)別-創(chuàng)新互聯(lián)

    PG中事務(wù)號有兩個概念,一個就是通常意義上的事務(wù)號transaction id。如tuple中的xmin,xmax等。另外一個意義是虛擬事務(wù)ID,即virtual transaction ID。那么這兩個有

站在用戶的角度思考問題,與客戶深入溝通,找到臨泉網(wǎng)站設(shè)計與臨泉網(wǎng)站推廣的解決方案,憑借多年的經(jīng)驗,讓設(shè)計與互聯(lián)網(wǎng)技術(shù)結(jié)合,創(chuàng)造個性化、用戶體驗好的作品,建站類型包括:網(wǎng)站設(shè)計、成都做網(wǎng)站、企業(yè)官網(wǎng)、英文網(wǎng)站、手機(jī)端網(wǎng)站、網(wǎng)站推廣、域名申請、網(wǎng)站空間、企業(yè)郵箱。業(yè)務(wù)覆蓋臨泉地區(qū)。

什么區(qū)別呢?

 

1.Transaction Id

     它是用來標(biāo)識事務(wù)的順序的,類似于Oracle的LSN(Logical Sequence Number)。但是PG中的這個事務(wù)號是可以wrap的,也就是重復(fù)使用的。

PG定義此事務(wù)ID為32位長度。相當(dāng)于4 billion。因為是重復(fù)使用的,所以首尾相接,構(gòu)成一個環(huán)。那也就是說,對于任何一個事務(wù)ID,有2 billion的事務(wù)ID比自己old,

有2 billion的事務(wù)比自己new。另外有三個事務(wù)ID有特殊意義:”0”代表invalid 事務(wù)號,”1”代表bootstrap事務(wù)號,“2”代表frozen 事務(wù),“3”代表最小的用戶事務(wù)ID。

另外,1“和”2“也都是valid。frozen transaction id比任何事務(wù)都要old。PG用來解決事務(wù)號wrap問題,在事務(wù)號循環(huán)使用情況下,可能會出現(xiàn)新的事務(wù)號比老的事務(wù)號要小。

因此將老的事務(wù)號設(shè)置為”2”,表示是frozen transaction。frozen transaction id的動作由vacuum發(fā)起。具體介紹請我的另外一篇文章”PostgreSQL vacuum原理—vacuum揭秘“。

transaction id的產(chǎn)生受lwlock ”XidGenLock“保護(hù),存放在ShmemVariableCache共享內(nèi)存段中。

transaction id 源碼定義如下:

PostgreSQL  XID與virtual XID區(qū)別

事務(wù)號類型定義:

PostgreSQL  XID與virtual XID區(qū)別

 

2.Virtual Transaction Id

   也就是通常所講的虛擬事務(wù)ID。virtual transaction id 由兩部分組成,backend process ID 號和local transaction id組成。

backend process ID 號不是操作系統(tǒng)的進(jìn)程ID,而是PG中用來標(biāo)識進(jìn)程序列號的ID。而local transansaction id也是用32位長度來表示。跟上面講的transaction id的區(qū)別看名字就知道:是local和非local的差別。

也就是說這個local transaction id是每個backend 進(jìn)程獨有的。而上面第一部分講的transaction id是全局的,即整個PG cluster 級別的。

PostgreSQL  XID與virtual XID區(qū)別

圖中第一個紅色圈中部分就是全局的transaction id。而第二圈中的內(nèi)容就是virtual transaction id。 backend id號和local transaction id用”/“符號分隔。

前面部分為backend id號,后面部分為local transaction id。第三個紅色圈中部分為系統(tǒng)進(jìn)程號。這里明顯看到,virtual transaction id中的backend id號跟第三個紅色圈中的pid是不同的。
pid是操作系統(tǒng)的進(jìn)程號。virtual transaction id只有valid 和invalid之分。”0“表示為invalid,其它都是valid。另外,virtual transaction id 在數(shù)據(jù)庫重起后,就會重新使用;但是在同一個backend id下會按順序增長。

virtual transaction id的持有,都是ExclusiveLock,因為在一個進(jìn)程私有空間內(nèi),不存在爭用情況。這點上,跟transaction id是一樣的,transaction id是全局獨享的,因此也是ExclusiveLock。

從上面圖中的mode列,我們可以清晰的看到。

定義如下:

PostgreSQL  XID與virtual XID區(qū)別

 

3.總結(jié)

為什么PG會搞這么兩個transaction id呢,用途和意義是什么呢?

    我們知道,像類似于SELECT語句,并不會改變數(shù)據(jù)庫;而DML語句會對數(shù)據(jù)庫狀態(tài)產(chǎn)生影響。因此這也就是為什么區(qū)別對待的原因。

transaction id屬于permanent id,即永久ID。它的意義是指對數(shù)據(jù)庫的更改序列,使得數(shù)據(jù)庫從一種狀態(tài)變成另外一種狀態(tài),而且狀態(tài)的改變是持久的,可恢復(fù),是一致性的。

這也符合的數(shù)據(jù)庫理論ACID的要求。

    而查詢,實際上并不需要這種永久事務(wù)ID,只需要處理好MVCC,鎖的獲取和釋放即可,因此virtual transaction id也就足夠了。不需要去獲取XidGenLock而產(chǎn)生transaction id,

從而提高數(shù)據(jù)庫性能。另外,數(shù)據(jù)庫也不會因為查詢而導(dǎo)致transaction id快速wrap around。MVCC的處理是不需要transaction id值的。當(dāng)查詢時,獲取當(dāng)前每個活動進(jìn)程的xmin和xmax值,

以此區(qū)間去對比每個tuple header中的xmin和xmax即可得到可見性snapshot。MVCC詳細(xì)實現(xiàn)見”PostgreSQL MVCC 源碼實現(xiàn)“。

    另外獲取的時機(jī)也有很大差別。PG的事務(wù)實現(xiàn)有三層,分別為top layer, middle layer 和bottom layer。virtual transaction id在top layer中獲取。不管是查詢,還是DML操作,每個

命令都有virtual transaction id。而transaction id是在bottom layer中獲取的,只有真正涉及到數(shù)據(jù)修改時,才去獲取。修改tuple后,會將transaction id的值存放到tuple header 中,

這也是我們通常講的xmin或者xmax。

網(wǎng)頁名稱:PostgreSQLXID與virtualXID區(qū)別-創(chuàng)新互聯(lián)
本文地址:http://jinyejixie.com/article26/gpscg.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供移動網(wǎng)站建設(shè)、企業(yè)建站網(wǎng)站設(shè)計、面包屑導(dǎo)航、網(wǎng)站收錄、品牌網(wǎng)站設(shè)計

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)

營銷型網(wǎng)站建設(shè)
吉隆县| 西乡县| 湖南省| 黎平县| 泊头市| 察哈| 广饶县| 泸州市| 临湘市| 长泰县| 吉木乃县| 松原市| 阜新| 武定县| 武功县| 通榆县| 太白县| 洛宁县| 革吉县| 太原市| 新巴尔虎右旗| 江门市| 九寨沟县| 临高县| 榆中县| 林甸县| 梅州市| 五家渠市| 余姚市| 广东省| 浦县| 白玉县| 楚雄市| 平凉市| 敦煌市| 柳江县| 卢湾区| 平利县| 广汉市| 威海市| 哈密市|