Deadlock xảy ra khi hai (hoặc nhiều) transaction chờ khóa của nhau theo vòng: T1 giữ khóa A và xin B, T2 giữ khóa B và xin A → cả hai kẹt vĩnh viễn.
Nguyên nhân điển hình: các transaction khóa cùng tập bản ghi nhưng theo thứ tự khác nhau; giữ khóa quá lâu; nâng cấp khóa (đọc rồi mới ghi).
Cách tránh:
- Khóa theo thứ tự nhất quán: mọi transaction luôn khóa tài nguyên theo cùng một trình tự (vd tăng dần theo id).
- Transaction ngắn: làm ít việc, commit sớm, giảm thời gian giữ khóa.
- Giảm phạm vi khóa; cân nhắc optimistic locking cho contention cao.
DB (như PostgreSQL) tự phát hiện deadlock và hủy một transaction làm nạn nhân (trả lỗi) → app cần bắt lỗi và retry.