MVCC trong postgresql

MVCC trong postgresql

MVCC trong postgresql là gì

MVCC (Multi-Version Concurrency Control) là c? ch? ki?m soát concurrency ?? x? lí nhi?u transaction ??ng th?i mà kh?ng lock b?ng hay dòng. Thay vì lock, Postgresql duy trì nhi?u phiên b?n c?a 1 dòng, cho phép ??c và ghi có th? th?c hi?n cùng lúc trên 2 phiên b?n mà kh?ng ?nh h??ng l?n nhau.

Tuple

? trong postgresql thì 1 row ???c g?i là 1 tuple. Khi 1 row ???c insert, update hay delete, Postgresql qu?n ly nhi?u version c?a 1 tuple ?? ??m b?o tính nh?t quán (consistency) và tính c? l?p (isolation) cho các transaction ??ng th?i.

Tuple version

Tuple version dùng ?? tr? t?i 1 phiên b?n c? th? c?a 1 row trong b?ng. Thay vì s?a, xóa tr?c ti?p b?n ghi, postgresql s? t?o ra 1 tuple m?i và ???c l?u tr? trong 1 vùng g?i là Heap (s? nói k? h?n ? bài sau)

Các thành ph?n trong tuple

xmin: (insert transaction id)

  • id c?a transaction ?? t?o ra phiên b?n này c?a tuple (t?o ra có th? là insert ho?c update)
  • 1 tuple ???c nhìn th?y (visible) v?i transaction n?u transaction id hi?n t?i l?n h?n ho?c b?ng v?i xmin

xmax: (delete transaction id)

  • id c?a transaction dùng ?? ?ánh d?u 1 phiên b?n ?? b? xóa (do b? xóa ho?c bi update b?i 1 transaction khác)
  • n?u xmax = 0 t?c là ?ó là phiên b?n v?n còn "s?ng" (ch?a b? xóa ?i)

ctid

  • ??a ch? v?t lí c?a tuple. Do tuple ???c l?u tr? trên heap nên ctid chính là ??a ch? c?a tuple ? trên heap.

flags

  • ?ánh d?u 1 tuple là live, deleted hay frozen

Vòng ??i c?a 1 tuple

Insert

  • 1 tuple m?i ???c t?o ra khi row ???c thêm m?i
  • xmin = transaction id hi?n t?i, xmax = 0 (tuple ?ang "s?ng")

Update

  • khi update 1 row thì 1 tuple m?i ???c t?o ra
  • ??i v?i tuple c?, xmax = transaction id v?a update
  • ??i v?i tuple m?i, xmin = transaction id v?a update và xmax = 0

Delete

  • tuple v?n còn trên heap, ch? ???c ?ánh d?u là b? xóa
  • xmax = transaction delete

Có th? th?y r?ng v?i b?t kì hành ??ng ghi nào vào db thì postgresql l?i t?o ra 1 version m?i, nh? v?y dung l??ng có th? t?ng lên r?t nhi?u. ??i v?i b?ng có index, các tuple trong index c?ng ???c t?o ra cùng v?i b?ng chính. ?? gi?i quy?t v?n ?? ?ó, postgresql có 1 c? ch? g?i là Vacuum dùng ?? d?n các tuple kh?ng còn ho?t ??ng, v? vacuum mình s? chia s? ? 1 bài khác.

Ví d?

Gi? s? có b?ng accounts có 2 giá tr? id và balance

CREATE TABLE accounts (  
  id SERIAL PRIMARY KEY,  
  balance NUMERIC(10, 2) NOT NULL  
);
        

Insert 1 b?n ghi

INSERT INTO accounts (id, balance) VALUES (1, 100);
        

Ki?m tra l?i b?n ghi v?a insert

SELECT xmin, xmax, ctid, * FROM accounts;
        


K?t qu?: có th? th?y r?ng transaction insert v?a r?i là 842, và tuple có ctid (??a ch? trên heap) là (0,1) Th? update b?n ghi

UPDATE accounts SET balance = 120 WHERE id = 1;
        


K?t qu?: có th? th?y r?ng xmin b?n ghi m?i là 844, t?c transaction 844 ?? t?o ra 1 tuple m?i. ?? ki?m tra l?i các dead tuple, c?n s? d?ng extension pageinspect

CREATE EXTENSION IF NOT EXISTS pageinspect;  
  
SELECT t_xmin::text AS xmin, t_xmax::text AS xmax, t_ctid::text AS ctid  
FROM heap_page_items(get_raw_page('accounts', 0));
        


Có th? th?y r?ng l?n insert ??u tiên có xmin là 842, sau khi update 2 l?n thì tuple m?i nh?t có xmin là 844 và xmax là 0 (live tuple). ??n ?ay thì mình nh?n ra 1 ?i?u r?t thú v? ?ó là m?c dù l?n insert ??u tiên có ctid là (0,1) nh?ng l?n sau nó ?? chuy?n thành (0, 2), và 2 tuple sau l?i có cùng ctid (0, 3). Mình th? tìm hi?u thì th?y r?ng postgres t?n d?ng vùng nh? ?? cùng l?u 2 tuple dead và live có th? dùng chung.

Nh?ng v?n ?? v?i MVCC

  • Do ph?i l?u tr? nhi?u phiên b?n khác nhau nên có th? gay ra tình tr?ng bùng n? storage bao g?m c? index goi là index bloat. N?u b?ng có nhi?u index, thì m?t c?p nh?t nh? c?a row có th? gay ra update r?t nhi?u các index làm t?ng dung l??ng.
  • Ti?n trình Vacuum có th? giúp d?n d?p các version c? nh?ng ph?i m?t c?ng qu?n lí b?o trì c?ng nh? monitor.

要查看或添加评论,请登录

Huy Nguyen的更多文章

  • 0.01 và 0.25 ^ 4

    0.01 và 0.25 ^ 4

    Hello m?i ng??i. Cu?i tu?n th? 7 v?a r?i mình có m?t bu?i offline v?i c?ng ??ng wecommit.

    1 条评论
  • Domain-driven design - Tactical design

    Domain-driven design - Tactical design

    Tóm t?t DDD M?c tiêu c?a DDD là thi?t k? ph?n m?m ??t nghi?p v? vào trung tam, tách bi?t nghi?p v? v?i c?ng ngh?. DDD…

  • Gi?i thi?u AI và Machine learning

    Gi?i thi?u AI và Machine learning

    Hello ace, h?m T7 v?a r?i mình có offline nhóm wecommit, n?i dung v? Gi?i thi?u AI và Machine learning. Bu?i chia s?…

    2 条评论
  • Event storming cùng microservice và Domain driven design

    Event storming cùng microservice và Domain driven design

    Hello m?i ng??i, th? 7 v?a r?i mình có bu?i chia s? v?i anh em wecommit v?i ch? ?? "Event storming cùng microservice và…

    7 条评论
  • Free talk: L?p trình viên chuyên nghi?p

    Free talk: L?p trình viên chuyên nghi?p

    Hello anh em, ngày h?m qua mình l?i có bu?i off cùng anh em wecommit. Ch? ?? tu?n này là v? "L?p trình viên chuyên…

  • Làm sao ?? làm quen d? án m?i m?t cách nhanh nh?t

    Làm sao ?? làm quen d? án m?i m?t cách nhanh nh?t

    Hello anh em, tu?n v?a r?i mình v?a có 1 bu?i offline c?ng ??ng we commit. B?n cu?i tu?n OT nên nay mình m?i có th?i…

  • Loay hoay ch?n h??ng ?i, làm tech lead hay làm qu?n ly?

    Loay hoay ch?n h??ng ?i, làm tech lead hay làm qu?n ly?

    H?m nay mình l?i có d?p ng?i cùng anh em wecommit ?? bàn lu?n ch? ?? này. Mình hi?n ?ang là m?t middle dev, và c?ng…

    7 条评论
  • Phan m?nh index trong database

    Phan m?nh index trong database

    Khi update data trong b?ng th??ng xuyên có th? làm index b? phan m?nh, gay ra v?n ?? v? hi?u n?ng khi truy xu?t d?…

    1 条评论
  • B Tree và database index

    B Tree và database index

    Bài vi?t giúp b?n hi?u v? c?u trúc B Tree, B+Tree, cách index ho?t ??ng trong database, và t?i sao GUID dùng làm PK là…

    6 条评论
  • Cách postgres t? ch?c d? li?u

    Cách postgres t? ch?c d? li?u

    Database ? c?p ?? cao nh?t, thì data ???c l?u trong database. 1 single instance có th? qu?n ly nhi?u databases cùng 1…

    1 条评论