2009-12-30 110 views
5

Có danh sách ngắn gọn về các lỗi thủ tục được lưu trữ trong SQL Server có ý nghĩa để tự động thử lại không? Rõ ràng, việc thử lại lỗi "đăng nhập không thành công" không có ý nghĩa, nhưng việc thử lại "hết thời gian chờ" sẽ thực hiện. Tôi nghĩ rằng nó có thể được dễ dàng hơn để xác định các lỗi để thử lại hơn để xác định lỗi nào không thử lại.Danh sách các lỗi SQL Server cần được thử lại?

Vì vậy, bên cạnh lỗi "hết giờ", các lỗi khác sẽ là ứng cử viên tốt để thử lại tự động là gì?

Cảm ơn!

Trả lời

3

Bạn nên thử lại (chạy lại) toàn bộ giao dịch, không chỉ một truy vấn/SP. Đối với các lỗi để thử lại, tôi đã sử dụng danh sách sau đây:

DeadlockVictim = 1205, 
SnapshotUpdateConflict = 3960, 
// I haven't encountered the following 4 errors in practice 
// so I've removed these from my own code: 
LockRequestTimeout = 1222, 
OutOfMemory = 701, 
OutOfLocks = 1204, 
TimeoutWaitingForMemoryResource = 8645, 

Điều quan trọng nhất của khóa học là "bế tắc nạn nhân" lỗi 1205.

+1

Bao gồm '3960' (" Giao dịch cách ly Snapshot bị hủy bỏ do xung đột cập nhật ") nếu bạn đang sử dụng cấp độ cách ly Ảnh chụp nhanh mới (ish), vì lỗi đó sẽ hiển thị thay vì bế tắc.Bạn cũng có thể muốn bao gồm '3621' là cái chung chung" Câu lệnh đã bị chấm dứt "và thường đi kèm với các lỗi khác. – Nick

0

Tôi không chắc chắn về danh sách đầy đủ các lỗi này, nhưng tôi có thể cảnh báo bạn RẤT cẩn thận về việc thử lại các truy vấn. Thường thì có vấn đề lớn hơn khi bạn nhận được lỗi từ SQL và chỉ cần truy vấn lại sẽ chỉ tiếp tục thu gọn vấn đề. Ví dụ, với lỗi hết thời gian chờ, bạn thường sẽ có một nút nghẽn mạng, các bảng được lập chỉ mục kém hoặc một thứ gì đó trên các dòng đó, và chạy lại cùng một truy vấn sẽ thêm vào độ trễ của các truy vấn khác rõ ràng đang cố gắng thực thi.

0

Lỗi máy chủ một sql mà bạn nên luôn luôn bắt vào chèn và cập nhật (và nó thường bị bỏ qua), là lỗi bế tắc số không. 1205

Hành động thích hợp là thử lại INSERT/UPDATE một số lần nhỏ.

2

tôi sẽ mở rộng danh sách đó, nếu bạn muốn danh sách hoàn toàn hoàn chỉnh, hãy sử dụng truy vấn và lọc kết quả.

select * from master.dbo.sysmessages where description like '%memory%' 


    int[] errorNums = new int[] 
    { 
     701, // Out of Memory 
     1204, // Lock Issue 
     1205, // Deadlock Victim 
     1222, // Lock request time out period exceeded. 
     7214, // Remote procedure time out of %d seconds exceeded. Remote procedure '%.*ls' is canceled. 
     7604, // Full-text operation failed due to a time out. 
     7618, // %d is not a valid value for a full-text connection time out. 
     8628, // A time out occurred while waiting to optimize the query. Rerun the query. 
     8645, // A time out occurred while waiting for memory resources to execute the query. Rerun the query. 
     8651, // Low memory condition 
    }; 
2
Bạn có thể sử dụng truy vấn SQL để tìm các lỗi yêu cầu thử lại một cách rõ ràng (cố gắng loại trừ các lỗi yêu cầu hành động khác).

SELECT error, description 
FROM master.dbo.sysmessages 
WHERE msglangid = 1033 
     AND (description LIKE '%try%later.' OR description LIKE '%. rerun the%') 
     AND description NOT LIKE '%resolve%' 
     AND description NOT LIKE '%and try%' 
     AND description NOT LIKE '%and retry%' 

Dưới đây là danh sách các mã lỗi: 539, 617, 952, 956, 983, 1205, 1807, 3055, 5034, 5059, 5061, 5065, 8628, 8645, 8675, 10.922, 14.258 , 20.689, 25.003 , 27 118, 30.024, 30.026 , 30.085, 33.115 , 33.116, 40.602 , 40.642,

Bạn có thể tinh chỉnh các truy vấn để tìm kiếm các điều kiện khác như timeout hoặc các vấn đề bộ nhớ, nhưng tôi khuyên bạn nên định cấu hình độ dài thời gian chờ của bạn chính xác ở phía trước và sau đó sao lưu nhẹ trong các trường hợp này.

Các vấn đề liên quan