PostgreSQl的MVCC

T1YSL發表於2021-08-03

基於多箇舊值版本的併發控制即MVCC,就是實現一致讀

PostgreSQL為每一個事務分配一個遞增的、型別為int32的整數作為唯一的事務ID,即xid。
建立一個新的快照時,將收集當前正在執行的事務id和已提交的最大事務id。
根據快照提供的資訊,PostgreSQL可以確定事務的操作是否對執行語句是可見的。
PostgreSQL還在系統裡的每一行記錄上都儲存了事務相關的資訊,同樣用來判斷一行記錄對於當前事務是否可見。

在PostgreSQL的內部資料結構中,每個元組(行記錄)有4個事務可見性相關的隱藏列:xmin , xmax, cmin, cmax
其中cmin和cmax分別是插入和刪除該元組的命令在事務對其他事務的可見性相關;xmin儲存了建立該行資料的事務的xid,xmax儲存的是刪除改行的xid。

sarah=# create table tbl_mvcc(id serial primary key, ival int);
CREATE TABLE
sarah=# insert into tbl_mvcc(ival) values(1);
INSERT 0 1
sarah=# select xmin, xmax, cmin, cmax, id, ival from tbl_mvcc where id=1;
 xmin | xmax | cmin | cmax | id | ival 
------+------+------+------+----+------
  599 |    0 |    0 |    0 |  1 |    1
(1 row)

當插入一行資料時,PostgreSQL會將插入這行資料的事務的xid儲存在xmin中。
由回滾的事務或未提交的事務建立的行對於任何其他事務都是不可見的;

sarah=# begin;
BEGIN
sarah=# select txid_current();
 txid_current 
--------------
          622
(1 row)
sarah=# insert into tbl_mvcc(id, ival) values(6,6);
INSERT 0 1
sarah=# select xmin, xmax, cmin, cmax, id, ival from tbl_mvcc where id=6;
 xmin | xmax | cmin | cmax | id | ival 
------+------+------+------+----+------
  622 |    0 |    0 |    0 |  6 |    6
(1 row)

開啟另一個會話:

postgres=# select txid_current();
 txid_current 
--------------
          623
(1 row)
sarah=# select * from tbl_mvcc where id=6;
 id | ival 
----+------
(0 rows)

未提交就看不見;

透過xmax值判斷事務的更新操作和刪除操作:

  1. 如果沒有設定xmax值,該事務對於其他事務總是可見的;
  2. 如果他被設定為回滾事務xid,該事務對其他事務也是可見的;
  3. 如果它被設定為一個正在執行,沒有commit和rollback的事務xid,該行對其他事務時可見的;
  4. 如果它被設定為一個已提交的事務xid,該行對這個已提交之後發起的所有事務都是不可見的;


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/69990629/viewspace-2785008/,如需轉載,請註明出處,否則將追究法律責任。

相關文章