Có nhiều lý do khiến các ứng dụng có thể phản hồi chậm, nhưng nếu người dùng phàn nàn về hiệu suất, bạn có thể đang gặp phải sự cố SQL Server. May mắn thay, có nhiều cách để xác định và sửa lỗi SQL Server deadlock, và thậm chí ngăn chặn nó ảnh hưởng tiêu cực đến hiệu suất ứng dụng.
SQL Server deadlock về cơ bản là một bế tắc giữa hai tiến trình đang cạnh tranh để giành quyền truy cập độc quyền vào cùng một tài nguyên. Vì chỉ có một quy trình có thể sử dụng tài nguyên tại một thời điểm, hiệu suất sẽ chậm lại cho đến khi giải quyết xong bế tắc.
Có hai loại bế tắc của SQL Server cần đề phòng:khóa chuyển đổi và khóa chu kỳ.
Sự cố khóa chuyển đổi xảy ra khi một chuỗi cố gắng chuyển đổi một khóa từ một loại độc quyền sang một loại độc quyền khác nhưng không thể vì một chuỗi khác đã giữ một khóa chia sẻ trên tài nguyên mà chuỗi đầu tiên đang cố gắng chuyển đổi.
Trong SQL Server, có ba loại khóa chuyển đổi:
- Được chia sẻ với mục đích độc quyền (SIX):Khóa này xảy ra khi một giao dịch giữ một khóa dùng chung cũng có một khóa riêng trên một số trang hoặc hàng.
- Chia sẻ với bản cập nhật có mục đích (SIU):Khóa này xảy ra khi một giao dịch giữ một khóa dùng chung cũng có một số trang hoặc hàng bị khóa bằng khóa cập nhật.
- Cập nhật với mục đích độc quyền (UIX):Khóa này xảy ra khi một giao dịch có khóa cập nhật cũng có khóa độc quyền trên một số trang hoặc hàng.
Khóa chu kỳ là tình trạng bế tắc của Máy chủ SQL do hai quy trình tranh giành một khóa độc quyền trên một tài nguyên bị khóa bởi quy trình kia.
Ví dụ:Quy trình 1 đang giữ khóa Tài nguyên 1 trong khi chờ Quy trình 2 giải phóng khóa trên Tài nguyên 2. Nếu Quy trình 2 đang giữ khóa Tài nguyên 2 trong khi chờ Quy trình 1 giải phóng Tài nguyên 1, chúng ta đã có chính mình. khóa bế tắc chu kỳ.
Cách chẩn đoán bế tắc máy chủ SQL
SQL Server bế tắc chỉ là một trong hàng tá lý do có thể khiến ứng dụng của bạn có vấn đề về hiệu suất. Nếu các truy vấn thường chạy nhanh đột nhiên bị chậm lại, có thể bạn đã gặp phải bế tắc. Nhưng cũng có thể có chuyện khác đang diễn ra.
Vì vậy, ngoài việc nhận thấy tốc độ truy vấn giảm, làm thế nào để bạn xác định chắc chắn liệu bế tắc có phải là nguyên nhân gây ra các vấn đề về hiệu suất cơ sở dữ liệu của bạn hay không?
Cách dễ nhất và dứt khoát nhất để xác định bế tắc là sự hiện diện của thông báo lỗi 1205:
Giao dịch (Process ID% d) đã bị deadlock trên%. * Ls tài nguyên với một tiến trình khác và đã được chọn làm nạn nhân của deadlock. Chạy lại giao dịch.
Thông báo lỗi 1205 theo nghĩa đen cho bạn biết có một bế tắc và cách khắc phục nó. Tuy nhiên, như Jeremiah Peschka đã chỉ ra, nếu bạn chưa khắc phục được nguyên nhân gây ra bế tắc, thì việc chạy lại giao dịch có thể sẽ không thành công.
Một tùy chọn khác để tìm các bế tắc là kéo biểu đồ bế tắc của SQL Server ra khỏi Sự kiện mở rộng. Giải nén bế tắc thông qua Sự kiện mở rộng cho phép bạn xem XML bế tắc, cung cấp nhiều thông tin hơn là biểu diễn đồ họa của biểu đồ bế tắc.
XML deadlock được sắp xếp theo danh sách nạn nhân, danh sách tiến trình và danh sách tài nguyên. Mỗi phần cung cấp mô tả chi tiết về các nạn nhân, quy trình và tài nguyên liên quan đến bế tắc, giúp khắc phục sự cố và giải quyết vấn đề dễ dàng hơn.
Cách khắc phục SQL Server Deadlock
Cách duy nhất để giải quyết bế tắc SQL Server là chấm dứt một trong các quá trình và giải phóng tài nguyên bị khóa để quá trình có thể hoàn tất. Điều này xảy ra tự động khi SQL Server phát hiện thấy một bế tắc và loại bỏ một trong các quy trình cạnh tranh (tức là nạn nhân).
SQL Server thường chọn kết nối nào để ngắt một cách ngẫu nhiên, nhưng có thể thiết lập các mức ưu tiên của deadlock để xác định kết nối nào bị ngắt trong khi deadlock. Khi hai kết nối có cài đặt mức độ ưu tiên khác nhau, SQL Server sẽ loại bỏ giao dịch có mức độ ưu tiên thấp nhất.
Cách ngăn chặn bế tắc máy chủ SQL
SQL Server bế tắc là một thực tế của cuộc sống khi bạn đang quản lý một cơ sở dữ liệu bận rộn. Tuy nhiên, DBA có thể giúp giảm thiểu sự xuất hiện của các bế tắc và giảm thiểu tác động của chúng đến hiệu suất cơ sở dữ liệu bằng cách thực hiện một số biện pháp phòng ngừa:
- Tạo các chỉ mục tốt hơn
- Điều chỉnh mức độ ưu tiên của giao dịch
- Kích hoạt mô hình Thử / Thử lại
- Thay đổi các chế độ cách ly
- Giữ khóa trong thời gian ngắn nhất có thể
- Truy cập các tài nguyên theo cùng một thứ tự mọi lúc
- Không gửi giao dịch cho đến khi bạn có tất cả thông tin cần thiết
- Giới hạn báo cáo khóa
Mặc dù không thể ngăn chặn hoàn toàn tình trạng bế tắc của SQL Server, nhưng bạn có thể triển khai các phương pháp hay nhất này và chủ động phá vỡ một số nguồn gây bế tắc phổ biến nhất để giữ cho các giao dịch trôi chảy và tối ưu hóa hiệu suất cơ sở dữ liệu.