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