2. 19:10 12/08/2026
Chào bạn Minh Tâm,
Isolation level không phải nút “nhanh hơn/an toàn hơn” chung cho mọi ứng dụng. Nó quyết định những quan sát mà transaction được phép thấy và cách database phối hợp concurrent read/write. InnoDB dùng MVCC để hỗ trợ consistent read, nhưng transaction dài vẫn khiến hệ thống phải giữ/khôi phục phiên bản cũ lâu hơn.
Cách chọn nên bắt đầu từ invariant nghiệp vụ và truy vấn thực:
1. Liệt kê use case cần snapshot nhất quán trong một transaction, use case nào chỉ cần dữ liệu mới nhất chấp nhận được và use case nào phải khóa để tránh ghi đè/oversell.
2. Giữ transaction ngắn, không chờ HTTP/email/user input khi transaction đang mở. Đây thường là cải thiện quan trọng hơn đổi isolation level.
3. Với thao tác cần serialize/giữ invariants, dùng điều kiện update nguyên tử hoặc locking read có chủ đích; không hy vọng isolation mặc định tự sửa race condition do application read-then-write.
4. Kiểm thử concurrency bằng nhiều request thật, theo dõi lock wait/deadlock và xác minh kết quả cuối cùng chứ không chỉ xem từng request có trả 200 hay không.
5. Nếu thay isolation level, thực hiện theo phạm vi nhỏ, đo lại và document behavior được chấp nhận; đừng đổi global chỉ để xử lý một endpoint.
Deadlock vẫn có thể xuất hiện trong các write transaction. Application cần xử lý retry có giới hạn cho lỗi transient/idempotent, đồng thời dùng log để cải thiện thứ tự lock và transaction scope.
Tham khảo: MySQL InnoDB multi-versioning, transaction management và deadlocks documentation.
0