Deadlock xảy ra khi hai (hoặc nhiều) transaction chờ khoá của nhau theo vòng tròn, không ai tiến được. Ví dụ kinh điển:
- T1 khoá hàng A rồi xin khoá hàng B.
- T2 khoá hàng B rồi xin khoá 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ó huỷ 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:
- Khoá 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 khoá; cân nhắc isolation level phù hợp.
- Chuẩn bị retry cho lỗi deadlock/serialization thay vì coi là fatal.