Trở về

Thứ Sáu, 27 tháng 6, 2025

Điều khiển truy xuất đồng thời - phần 2

cover
Farm in Brittany - Paul Sérusier (1890)

Transaction Isolation Level

Transaction Isolation Level là những mức cô lập giúp developer định nghĩa, điều khiển cách sử dụng cơ chế khoá ở tầng database.

Mức cô lập định nghĩa những hành động sau:

  • Có khoá hay không khi đọc dữ liệu và loại khoá nào sẽ được xin.
  • Giữ khoá đọc bao lâu.
  • Yêu cầu đọc sẽ ảnh hưởng tới các transaction khác như thế nào.

Chọn một mức cô lập

  • Mức cô lập càng thấp thì tốc độ đọc càng cao, đổi lại tính nhất quán sẽ thấp.
  • Ngược lại, mức cô lập cao sẽ đảm bảo tính nhất quán nhưng tốc độ đọc/ghi sẽ giảm.

Bảng so sánh Isolation Levels

Isolation LevelDirty ReadNon-repeatable ReadPhantom ReadGhi chú đơn giản
Read UncommittedNhanh nhất, ít khoá – có thể đọc dữ liệu chưa commit từ transaction khác
Read CommittedMỗi lần đọc là dữ liệu đã commit – tránh dirty read nhưng vẫn bị thay đổi dữ liệu
Repeatable ReadGiữ khoá đọc tới cuối transaction – dữ liệu đọc không thay đổi, nhưng có thể có bản ghi mới xuất hiện
SerializableCô lập tuyệt đối – như thể các transaction chạy lần lượt, nhưng chậm hơn nhiều

Minh hoạ đơn giản

Ví dụ: 2 người cùng truy cập bảng accounts

-- Transaction A
BEGIN;
SELECT balance FROM accounts WHERE id = 1;

-- Transaction B
UPDATE accounts SET balance = balance - 100 WHERE id = 1;
COMMIT;
Isolation LevelĐiều gì xảy ra?
Read UncommittedNgười 1 có thể thấy balance thay đổi dù Transaction B chưa commit (Dirty Read)
Read CommittedNgười 1 sẽ chỉ thấy dữ liệu sau khi Transaction B commit
Repeatable ReadNếu người 1 đọc lại balance, giá trị sẽ không thay đổi trong cùng 1 transaction
SerializableTransaction B phải đợi Transaction A kết thúc mới được chạy