1. Isolation Level là gì?
Isolation Level (mức cô lập giao dịch) là mức độ kiểm soát việc một transaction nhìn thấy những thay đổi của transaction khác khi nhiều transaction chạy đồng thời trên database.
Isolation là chữ I trong ACID. Mục tiêu của nó là hạn chế những kết quả không nhất quán khi nhiều request cùng đọc hoặc ghi dữ liệu.
Ví dụ, tài khoản A có số dư 1.000.000 đồng. Trong lúc request 1 đang chuyển tiền, request 2 cũng đọc và cập nhật số dư của tài khoản đó. Database cần có cơ chế xác định mỗi transaction được nhìn thấy dữ liệu ở trạng thái nào, thay đổi nào đã được xác nhận và cách xử lý khi hai transaction xung đột.
2. Ba vấn đề quan trọng khi nhiều transaction chạy đồng thời
Muốn hiểu Isolation Level, trước hết cần nắm ba hiện tượng phổ biến: Dirty Read, Non-repeatable Read và Phantom Read.
Dirty Read – Đọc dữ liệu chưa commit
Dirty Read xảy ra khi một transaction đọc được thay đổi mà transaction khác chưa commit.
Giả sử số dư ban đầu của tài khoản là 1.000.000 đồng.
Transaction A thực hiện:
BEGIN;
UPDATE accounts
SET balance = 500000
WHERE id = 1;
-- Chưa COMMIT
Trong lúc đó, transaction B đọc:
SELECT balance
FROM accounts
WHERE id = 1;
Nếu B nhìn thấy số dư 500.000 đồng trong khi A chưa commit, B đã đọc dữ liệu chưa được xác nhận. Nếu A sau đó rollback, giá trị mà B đọc được chưa từng trở thành trạng thái đã commit của database.
Đây là Dirty Read.
Phantom Read – Xuất hiện hoặc biến mất bản ghi khi truy vấn lại
Phantom Read xảy ra khi transaction thực hiện lại một truy vấn theo điều kiện và nhận được tập bản ghi khác do transaction khác đã commit thay đổi phù hợp với điều kiện đó.
Ví dụ, transaction A truy vấn:
SELECT *
FROM orders
WHERE status = 'pending';
Kết quả lần đầu có 10 đơn hàng.
Trong lúc đó, transaction B tạo một đơn hàng mới có status = 'pending' rồi commit. Khi A thực hiện lại truy vấn, kết quả có thể có 11 đơn hàng.
Bản ghi mới phù hợp với điều kiện truy vấn chính là một phantom row.
Phantom Read khác Non-repeatable Read ở điểm trọng tâm:
- Non-repeatable Read: giá trị của một bản ghi đã đọc thay đổi.
- Phantom Read: tập hợp bản ghi thỏa mãn điều kiện truy vấn thay đổi.
3. Bốn Isolation Level
READ UNCOMMITTED
READ UNCOMMITTED là mức cô lập thấp nhất trong bốn mức theo SQL standard.
Ở mức này, transaction có thể đọc những thay đổi chưa commit của transaction khác, nên Dirty Read có thể xảy ra. Non-repeatable Read và Phantom Read cũng có thể xảy ra.
Ví dụ:
SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED;
BEGIN;
SELECT balance
FROM accounts
WHERE id = 1;
COMMIT;
Câu lệnh trên minh họa cách thiết lập mức cô lập; cú pháp và thời điểm thiết lập cần tuân theo database đang sử dụng.
Ưu điểm: giảm một số yêu cầu về tính cô lập, có thể hữu ích trong những trường hợp đặc biệt mà dữ liệu chỉ mang tính tham khảo và độ chính xác tức thời không quan trọng.
Nhược điểm: application có thể đọc dữ liệu chưa commit và đưa ra quyết định sai.
READ COMMITTED
READ COMMITTEDbảo đảm mỗi câu truy vấn thông thường chỉ nhìn thấy dữ liệu đã commit trước thời điểm câu truy vấn bắt đầu.Ví dụ:BEGIN; SELECT balance FROM accounts WHERE id = 1; SELECT balance FROM accounts WHERE id = 1; COMMIT;Hai câu
SELECTcó thể trả về hai giá trị khác nhau nếu transaction khác cập nhật và commit dữ liệu giữa hai lần đọc. Hai câuSELECTcó thể trả về hai giá trị khác nhau nếu transaction khác cập nhật và commit dữ liệu giữa hai lần đọc. Vì vậy,READ COMMITTEDngăn Dirty Read nhưng vẫn cho phép Non-repeatable Read và Phantom Read theo mô hình SQL standard.
REPEATABLE READ
REPEATABLE READ cung cấp bảo đảm mạnh hơn về việc đọc lại dữ liệu trong cùng transaction. Theo SQL standard, khi một transaction đã đọc một bản ghi, những lần đọc lại không được xuất hiện Non-repeatable Read. SQL standard cho phép Phantom Read ở mức này, nhưng cách triển khai thực tế phụ thuộc database.
Ví dụ:
BEGIN;
SELECT balance
FROM accounts
WHERE id = 1;
-- Transaction khác cập nhật và COMMIT.
SELECT balance
FROM accounts
WHERE id = 1;
COMMIT;
Với một transaction sử dụng REPEATABLE READ, hai lần đọc thông thường sẽ thấy cùng một giá trị trong những điều kiện được bảo đảm bởi database, thay vì lần đọc sau tự động nhìn thấy mọi thay đổi mới đã commit.
SERIALIZABLE
SERIALIZABLE là mức cô lập nghiêm ngặt nhất trong bốn mức thông dụng.
Mục tiêu là bảo đảm kết quả của những transaction đã commit tương đương với một thứ tự thực thi tuần tự hợp lệ, như thể các transaction được chạy lần lượt thay vì đồng thời.
Ví dụ, một hệ thống có quy tắc rằng tổng số nhân viên trực ca không được thấp hơn hai người. Hai request đồng thời kiểm tra số người đang trực rồi quyết định cho hai nhân viên nghỉ. Mỗi request riêng lẻ có thể thấy đủ người, nhưng nếu cả hai cùng thành công, quy tắc tổng thể có thể bị vi phạm.
Đây là dạng vấn đề mà chỉ đọc từng bản ghi ổn định chưa chắc đã giải quyết được. SERIALIZABLE có thể phát hiện và ngăn những lịch thực thi dẫn đến kết quả không thể tương đương với một thứ tự tuần tự hợp lệ.
Ưu điểm:
- Cung cấp bảo đảm mạnh nhất về tính đúng đắn của kết quả khi chạy đồng thời.
- Phù hợp với nghiệp vụ có quy tắc toàn cục phức tạp mà các mức thấp hơn khó bảo vệ bằng những thao tác đơn giản.
Nhược điểm:
- Có thể phát sinh nhiều lỗi serialization cần retry.
- Có thêm chi phí kiểm soát xung đột.
- Application phải được thiết kế để xử lý transactIsolation Level quyết định mức độ cô lập giữa các transaction chạy đồng thời. Bốn mức thông dụng là
READ UNCOMMITTED,READ COMMITTED,REPEATABLE READvàSERIALIZABLE.Ba hiện tượng cơ bản cần hiểu là Dirty Read, Non-repeatable Read và Phantom Read. Ngoài ra, cần biết serialization anomaly để hiểu vì sao một transaction vẫn có thể gặp vấn đề concurrency ngay cả khi dữ liệu đọc được ổn định.
ion thất bại an toàn.
4. Tổng kết
Isolation Level quyết định mức độ cô lập giữa các transaction chạy đồng thời. Bốn mức thông dụng là READ UNCOMMITTED, READ COMMITTED, REPEATABLE READ và SERIALIZABLE.
Ba hiện tượng cơ bản cần hiểu là Dirty Read, Non-repeatable Read và Phantom Read. Ngoài ra, cần biết serialization anomaly để hiểu vì sao một transaction vẫn có thể gặp vấn đề concurrency ngay cả khi dữ liệu đọc được ổn định.








Khoá học lập trình game con rắn cho trẻ em




