Deadlock xảy ra khi hai (hoặc nhiều) transaction chờ khóa của nhau theo vòng tròn, không ai tiến được. Ví dụ kinh điển:
- T1 khóa hàng A rồi xin khóa hàng B.
- T2 khóa hàng B rồi xin khóa hàng A.
→ Cả hai chờ mãi.
DB (như PostgreSQL) có bộ phát hiện deadlock: khi thấy vòng chờ, nó hủy một transaction (nạn nhân) với lỗi, transaction kia đi tiếp; app phải bắt lỗi và retry.
Cách giảm/tránh:
- Khóa tài nguyên theo thứ tự nhất quán ở mọi nơi (luôn A trước B) → phá vòng chờ.
- Giữ transaction ngắn, chạm ít hàng, commit sớm.
- Giảm phạm vi/độ lâu của khóa; cân nhắc isolation level phù hợp.
- Chuẩn bị retry cho lỗi deadlock/serialization thay vì coi là fatal.