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 COMMITTED
và REPEATABLE 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 đượcNế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
Transaction B (song song)
→ 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
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