MVCC


⚙️ MVCC là gì?

MVCC (Multi-Version Concurrency Control) là kỹ thuật kiểm soát đồng thời nhiều phiên bản của dữ liệu, cho phép:

  • Đọc không cần lock

  • Viết không chặn đọc

  • Tăng throughput cho hệ thống có nhiều giao dịch song song

InnoDB sử dụng MVCC để triển khai các isolation levels như READ COMMITTEDREPEATABLE READ (default).


🧠 Nguyên lý hoạt động của MVCC

InnoDB lưu nhiều phiên bản (version) của mỗi row bằng cách sử dụng:

1. Hidden Columns (ẩn trong mỗi row)

Mỗi row trong InnoDB có 2 cột ẩn:

  • trx_id: ID của transaction cuối cùng đã ghi (update/insert).

  • roll_pointer: con trỏ tới undo log để phục hồi dữ liệu cũ nếu cần.


2. Undo Log

  • Ghi lại dữ liệu cũ trước khi một transaction thực hiện thay đổi.

  • Dùng để:

    • Phục vụ rollback khi transaction thất bại

    • Truy xuất version cũ trong khi đọc dữ liệu dưới MVCC


3. Transaction Visibility Rules

Khi một transaction đọc dữ liệu, InnoDB sẽ so sánh trx_id của row với snapshot của transaction hiện tại để quyết định có "nhìn thấy" row đó hay không.

Giải thích đơn giản:

  • Nếu trx_id của row > snapshot của transaction hiện tại ⇒ Không thấy được

  • Nếu trx_id ≤ snapshot ⇒ Có thể thấy, nếu không bị xóa (delete nhưng chưa commit)


🧪 Ví dụ đơn giản

Giả sử có table account(id, balance), bạn mở 2 transaction song song:

Transaction A

START TRANSACTION;
SELECT * FROM account WHERE id = 1;

Transaction B (song song)

START TRANSACTION;
UPDATE account SET balance = 2000 WHERE id = 1;
COMMIT;

→ Transaction A sẽ không thấy update từ transaction B nếu isolation level là REPEATABLE READ (vì A dùng snapshot tại thời điểm nó bắt đầu).


📌 Tóm gọn Flow MVCC đọc dữ liệu

  1. Khi SELECT, InnoDB sẽ:

    • Dựa vào snapshot được tạo khi transaction bắt đầu

    • Kiểm tra version hiện tại có "visible" không

    • Nếu không visible, dùng undo log để phục hồi version phù hợp để đọc


📈 Ưu điểm của MVCC

  • Tránh locking conflict (đặc biệt khi chỉ đọc)

  • Cải thiện hiệu năng cho hệ thống có nhiều concurrent read

  • Thân thiện với ORM như Hibernate hoặc JPA (vì transaction model phức tạp)


❗ Lưu ý cho Dev Senior

  • MVCC chỉ hoạt động với InnoDB, không phải MyISAM

  • Với SERIALIZABLE, InnoDB sẽ bỏ qua MVCC và dùng locking thật

  • Luôn hiểu rõ isolation level đang dùng để tránh phantom reads hay non-repeatable reads


Last updated