PostgreSQl的MVCC
基於多箇舊值版本的併發控制即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值判斷事務的更新操作和刪除操作:
- 如果沒有設定xmax值,該事務對於其他事務總是可見的;
- 如果他被設定為回滾事務xid,該事務對其他事務也是可見的;
- 如果它被設定為一個正在執行,沒有commit和rollback的事務xid,該行對其他事務時可見的;
- 如果它被設定為一個已提交的事務xid,該行對這個已提交之後發起的所有事務都是不可見的;
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/69990629/viewspace-2785008/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- PostgreSQL的MVCC vs InnoDB的MVCCSQLMVC
- PostgreSQL MVCC快照機制淺析SQLMVC
- PostgreSQL MVCC可見性判斷SQLMVC
- PostgreSQL DBA(24) - MVCC#4(快照中的xmax)SQLMVCC#
- PostgreSQL DBA(22) - MVCC#2(commit log)SQLMVCC#MIT
- PostgreSQL、Oracle/MySQL和SQL Server的MVCC實現原理方式OracleMySqlServerMVC
- PostgreSQL DBA(21) - MVCC#1(Multi Version Heap Tuple)SQLMVCC#
- PostgreSQL DBA(27) - MVCC#7(避免長事務)SQLMVCC#
- Postgresql MVCC架構對從庫長查詢的影響SQLMVC架構
- PostgreSQL DBA(55) - MVCC#8(對全表掃描的影響)SQLMVCC#
- PostgreSQL DBA(25) - MVCC#5(Tuple可見性判斷)SQLMVCC#
- PostgreSQL 原始碼解讀(126)- MVCC#10(vacuum過程)SQL原始碼MVCC#
- PostgreSQL 原始碼解讀(119)- MVCC#4(啟動事務)SQL原始碼MVCC#
- PostgreSQL 原始碼解讀(117)- MVCC#2(獲取快照#2)SQL原始碼MVCC#
- PostgreSQL 原始碼解讀(116)- MVCC#1(獲取快照#1)SQL原始碼MVCC#
- MVCC的概述MVC
- PostgreSQL DBA(23) - MVCC#3(事務快照和隔離級別)SQLMVCC#
- PostgreSQL 原始碼解讀(125)- MVCC#9(vacuum-主流程)SQL原始碼MVCC#
- PostgreSQL 原始碼解讀(118)- MVCC#3(Tuple可見性判斷)SQL原始碼MVCC#
- PostgreSQL DBA(26) - MVCC#6(Tuple可見性判斷-簡化版)SQLMVCC#
- PostgreSQL 原始碼解讀(122)- MVCC#7(提交事務-整體流程)SQL原始碼MVCC#
- PostgreSQL 原始碼解讀(134)- MVCC#18(vacuum過程-HeapTupleSatisfiesVacuum函式)SQL原始碼MVCC#APT函式
- MVCCMVC
- PostgreSQL 原始碼解讀(120)- MVCC#5(獲取事務號-主邏輯)SQL原始碼MVCC#
- PostgreSQL 原始碼解讀(127)- MVCC#11(vacuum過程-vacuum_rel函式)SQL原始碼MVCC#函式
- PostgreSQL 原始碼解讀(123)- MVCC#8(提交事務-實際提交過程)SQL原始碼MVCC#
- [Mysql]MVCCMySqlMVC
- PostgreSQL 原始碼解讀(121)- MVCC#6(獲取事務號-實現函式)SQL原始碼MVCC#函式
- PostgreSQL 原始碼解讀(130)- MVCC#14(vacuum過程-lazy_scan_heap函式)SQL原始碼MVCC#函式
- PostgreSQL 原始碼解讀(131)- MVCC#15(vacuum過程-lazy_vacuum_heap函式)SQL原始碼MVCC#函式
- PostgreSQL 原始碼解讀(128)- MVCC#12(vacuum過程-heap_vacuum_rel函式)SQL原始碼MVCC#函式
- 對Innodb中MVCC的理解MVC
- MVCC與鎖MVC
- PostgreSQL 原始碼解讀(132)- MVCC#16(vacuum過程-lazy_vacuum_index函式#1)SQL原始碼MVCC#Index函式
- PostgreSQL 原始碼解讀(129)- MVCC#13(vacuum過程-vacuum_set_xid_limits函式)SQL原始碼MVCC#MIT函式
- PostgreSQL 原始碼解讀(135)- MVCC#19(vacuum過程-heap_execute_freeze_tuple函式)SQL原始碼MVCC#函式
- PostgreSQL 原始碼解讀(133)- MVCC#17(vacuum過程-lazy_vacuum_index函式#2)SQL原始碼MVCC#Index函式
- mvcc的兩種層次的理解MVC