Deadlock xảy ra khi hai transaction kẹt chờ nhau: A giữ khóa mà B cần, B giữ khóa mà A cần — không ai nhường, thành vòng tròn chờ. PostgreSQL tự phát hiện và hủy một transaction để phá vòng; phía app phải bắt lỗi đó và thử lại (nếu thao tác an toàn để chạy lại).
Giảm deadlock bằng cách: luôn truy cập các tài nguyên theo cùng một thứ tự, giữ transaction ngắn, đánh index cho điều kiện update/delete để không khóa thừa nhiều dòng, và tuyệt đối không gọi API bên ngoài khi đang mở transaction.