Trong SQL Server có một luồng riêng định kỳ (mặc định 5 giây, khoảng thời gian thấp hơn nếu phát hiện bế tắc) kiểm tra danh sách chờ cho bất kỳ chu kỳ nào. Tức là nó xác định tài nguyên mà một luồng đang chờ, sau đó nó tìm thấy chủ sở hữu của tài nguyên đó và tìm đệ quy tài nguyên mà chủ đề đó đang chờ đợi, từ đó xác định các luồng đang chờ cho các tài nguyên khác.
Nếu tìm thấy bế tắc thì nạn nhân được chọn sẽ bị giết bằng thuật toán này:
- Xác định các chủ đề không phải là không thể thực hiện được (ví dụ như một chủ đề đang quay trở lại một giao dịch là không thể thực hiện được).
- Tìm chủ đề với mức ưu tiên bế tắc thấp nhất.
- Chọn một cái rẻ nhất để quay trở lại, tức là cái đã làm ít nhất cho đến nay.
Bạn có thể tìm thêm thông tin về phát hiện khóa chết máy chủ SQL tại đây:
http://msdn.microsoft.com/en-us/l Library
/ ms178104.aspx Chủ sở hữu giao dịch / nhà phát triển ứng dụng chịu trách nhiệm giảm thiểu rủi ro xảy ra bế tắc và phải làm rằng họ nên:
- Hãy chắc chắn để giữ các giao dịch càng ngắn càng tốt. Ví dụ: không hiển thị biểu mẫu đăng nhập sau khi bắt đầu giao dịch và đợi người dùng nhập vào, thay vào đó hãy thu thập tất cả thông tin bạn cần và sau đó chạy giao dịch.
- Sử dụng mức cô lập thấp nhất có thể, ví dụ: không đặt tuần tự hóa khi bạn chỉ muốn tạm thời hiển thị một số giá trị cho người dùng. Xin lưu ý rằng việc thiết lập mức cô lập chính xác là một khoa học trong chính nó và nằm ngoài phạm vi trong câu trả lời này.
- Nếu bạn là nạn nhân của sự bế tắc, tức là bạn gặp lỗi # 1205, sau đó chạy lại giao dịch của bạn một cách trong suốt cho người dùng của bạn. Vì khác, cạnh tranh, giao dịch giờ đây hy vọng có được các tài nguyên mà nó đang chờ đợi và kết thúc, không giống như bạn sẽ gặp lại bế tắc tương tự.