Sqlserver
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Sqlserver

Thỉnh thoảng nhận được SqlException:Hết thời gian chờ

Bạn cần điều tra điều này ở phía máy chủ để hiểu tại sao quá trình thực thi lại hết thời gian. Lưu ý rằng máy chủ không có thời gian chờ, thời gian chờ là do 30 giây mặc định trên SqlCommand.CommandTimeout .

Một tài nguyên tốt là Chờ và Hàng đợi , là một phương pháp để chẩn đoán tắc nghẽn hiệu suất với SQL Server. Dựa trên nguyên nhân thực tế của thời gian chờ, có thể thực hiện hành động thích hợp. Trước hết, bạn phải xác định xem bạn đang xử lý việc thực thi chậm (một kế hoạch tồi) hay bị chặn.

Nếu tôi mạo hiểm phỏng đoán, tôi sẽ nói rằng mô hình không lành mạnh của IF EXISTS... UPDATE là nguyên nhân sâu xa. Mẫu này không chính xác và sẽ gây ra lỗi trong điều kiện đồng thời. Hai giao dịch đồng thời thực hiện IF EXISTS đồng thời cả hai sẽ đi đến cùng một kết luận và cả hai cố gắng INSERT hoặc UPDATE . Tùy thuộc vào các ràng buộc thoát trong cơ sở dữ liệu mà bạn có thể gặp phải tình trạng bế tắc (trường hợp may mắn) hoặc bị mất ghi (trường hợp không may mắn). Tuy nhiên, chỉ có cuộc điều tra thích hợp mới tiết lộ nguyên nhân gốc rễ thực sự. Có thể là một cái gì đó hoàn toàn khác, như sự kiện tự động tăng trưởng .

Quy trình của bạn cũng đang xử lý khối CATCH không chính xác. Bạn phải luôn luôn kiểm tra XACT_STATE() bởi vì giao dịch có thể đã được khôi phục lại vào thời điểm khối CATCH của bạn chạy. Cũng không rõ ràng những gì bạn mong đợi từ việc đặt tên cho giao dịch, đây là một lỗi phổ biến mà tôi thấy thường liên quan đến các giao dịch được đặt tên gây nhầm lẫn với các điểm lưu. Để biết mẫu chính xác, hãy xem Xử lý ngoại lệ và giao dịch lồng nhau .

Chỉnh sửa

Đây là một cách khả thi để điều tra điều này:

  1. Thay đổi CommandTimeout thành 0 (tức là vô hạn).
  2. Bật blocked process threshold , đặt nó thành 30 giây (CommandTimeout trước đây)
  3. Giám sát trong Hồ sơ cho Sự kiện báo cáo quy trình bị chặn
  4. Bắt đầu khối lượng công việc của bạn
  5. Xem liệu Hồ sơ có tạo ra bất kỳ sự kiện báo cáo nào không. Nếu đúng, họ sẽ xác định nguyên nhân.

Những hành động này sẽ gây ra sự kiện 'báo cáo quy trình bị chặn' bất cứ khi nào bạn gặp phải thời gian chờ, nếu thời gian chờ là do chặn. Ứng dụng của bạn sẽ tiếp tục đợi cho đến khi quá trình chặn được gỡ bỏ, nếu việc chặn là do khóa trực tiếp thì nó sẽ đợi mãi mãi.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Trình kích hoạt Sql Server chèn các giá trị từ hàng mới vào một bảng khác

  2. Cách thêm dấu phân tách vào chuỗi nối trong SQL Server - CONCAT_WS ()

  3. Chọn dữ liệu từ hai máy chủ khác nhau trong SQL Server

  4. DATEFROMPARTS () Ví dụ trong SQL Server (T-SQL)

  5. Cú pháp không chính xác gần từ khóa 'with' ... câu lệnh trước đó phải được kết thúc bằng dấu chấm phẩy