Bốn mức chuẩn SQL, xếp từ lỏng đến chặt, mỗi mức chặn thêm một loại anomaly:
| Level | Dirty read | Non-repeatable read | Phantom |
|---|---|---|---|
| READ UNCOMMITTED | có thể | có thể | có thể |
| READ COMMITTED | không | có thể | có thể |
| REPEATABLE READ | không | không | tuỳ engine |
| SERIALIZABLE | không | không | không |
- Dirty read: đọc được dữ liệu của transaction khác chưa commit.
- Non-repeatable read: đọc cùng một hàng hai lần trong một transaction ra hai giá trị khác nhau.
- Phantom read: chạy lại cùng một điều kiện
WHEREthì xuất hiện thêm hàng mới.
Khác biệt mặc định:
- PostgreSQL mặc định READ COMMITTED, và không hề có dirty read — READ UNCOMMITTED được xử lý y hệt READ COMMITTED. Mỗi câu lệnh nhìn một snapshot mới, nên hai SELECT trong cùng transaction có thể ra khác nhau.
- MySQL/InnoDB mặc định REPEATABLE READ: các SELECT thường trong transaction đọc từ một snapshot cố định lấy ở lần đọc đầu tiên, nên lặp lại cho kết quả ổn định nhưng có thể đã lỗi thời.
Hệ quả thực tế khi port code giữa hai hệ: một báo cáo tổng hợp nhiều câu SELECT chạy đúng trên MySQL có thể lệch số trên PostgreSQL. Muốn ổn định thì nâng lên REPEATABLE READ một cách tường minh, đừng dựa vào mặc định.