2009-04-06 5 views
14

Trang web của tôi dường như không xử lý số lượng khách truy cập cao, tôi tin rằng đó là do máy chủ quá đơn giản.Gỡ rối deadlock trong Sql Server 2008

2 giờ trước trang web của tôi đã nhận được rất nhiều lượt truy cập và tôi nhận thấy rằng 3 lỗi bế tắc xảy ra, lỗi này là:

System.Data.SqlClient.SqlException : giao dịch (Process ID 58) bị bế tắc về tài nguyên khóa với một tiến trình khác và đã được chọn làm nạn nhân bế tắc. Chạy lại giao dịch.

Tôi không chắc tại sao điều này lại xảy ra ... Nhìn vào dấu vết ngăn xếp, tôi có thể thấy điều này xảy ra với truy vấn chọn.

Bất kỳ ai biết nguyên nhân của lỗi này có thể là gì?

Máy chủ đang chạy Windows 2008 và Sql Server 2008.

+0

http://support.microsoft.com/?kbid=832524 * CHỈNH SỬA * đây là liên kết được cập nhật đối với tài liệu của Profiler của SQL Server, mặc dù lý thuyết trong liên kết trên vẫn giữ nguyên. http://msdn.microsoft.com/en-us/library/ms188246.aspx – GregC

Trả lời

6

Ghi sẽ chặn đọc trên SQL Server, trừ khi bạn đã bật phiên bản hàng. Bạn nên sử dụng thủ tục được lưu trữ sp_who2 và theo dõi SQL Profiler. sp_who2 sẽ cho bạn biết quy trình nào đang chặn và quá trình này sẽ cho bạn biết câu lệnh cuối cùng dành cho quy trình chặn.

-3

Nếu bạn không nhớ đọc sách bẩn, bạn có thể thử đặt (NOLOCK) sau tên bảng trong truy vấn SELECT của bạn. Giao dịch ở đây là bạn không được đảm bảo dữ liệu cập nhật nhất khi các câu lệnh UPDATE và INSERT hiện đang thực thi bị bỏ qua.

Thông thường, điều này không gây ra nhiều sự cố khi hầu hết các hệ thống đọc nhiều hơn cập nhật/chèn, nhưng rõ ràng nó phụ thuộc vào bản chất của ứng dụng của bạn.

Ngoài ra có một cái nhìn tại http://www.sql-server-performance.com/tips/deadlocks_p1.aspx

+4

Nolock, không * chính xác * hiểu được hậu quả của "không được đảm bảo dữ liệu cập nhật nhất" là một ý tưởng rất tồi. –

+1

Tôi thực sự khuyên bạn nên sử dụng NOLOCK AGAINST. Tôi nhận ra đây là một bài viết cũ nhưng tôi cảm thấy tôi cần phải đưa ra một cảnh báo cho bất cứ ai tình cờ gặp vấn đề này (như tôi đã làm) tìm kiếm sự giúp đỡ với deadlocks. Cá nhân tôi đã thấy những hậu quả được mô tả bởi những tệ nạn của NOLOCK - và chúng rất khó để dọn dẹp. Không cho phép NOLOCK trở thành thói quen trong nhóm của bạn. Người ta có thể tranh luận rằng NOLOCK là cần thiết trong SQLServer 2000 do mô hình khóa ít hơn mạnh mẽ của nó, nhưng bắt đầu với SQLServer2005 có rất ít hoặc không cần cho nó. Nhìn vào ALTER DATABASE mydatabase SET READ_COMMITTED_SNAPSHOT ON. – ripvlan

8

SQL Server 2008 có nhiều cách để xác định các quá trình và các truy vấn liên quan đến bế tắc.

  1. Nếu bế tắc là dễ dàng để tái sản xuất, tần số cao và bạn có thể cấu hình SQL server (bạn có quyền truy cập và chi phí thực hiện trên máy chủ khi profiler được kích hoạt) sử dụng SQL Profiler sẽ cung cấp cho bạn cái nhìn đồ họa đẹp của bế tắc. Trang này có tất cả các thông tin mà bạn cần phải sử dụng đồ thị bế tắc http://sqlmag.com/database-performance-tuning/gathering-deadlock-information-deadlock-graph

  2. Hầu hết các lần tái bế tắc là khó khăn, hoặc khi chúng xảy ra trong môi trường sản xuất mà chúng tôi không muốn đính kèm Profiler để nó và ảnh hưởng đến hiệu suất.

Tôi sẽ sử dụng truy vấn này để có được sự bế tắc xảy ra:

SELECT 
    xed.value('@timestamp', 'datetime') as Creation_Date, 
    xed.query('.') AS Extend_Event 
FROM 
(
    SELECT CAST([target_data] AS XML) AS Target_Data 
    FROM sys.dm_xe_session_targets AS xt 
    INNER JOIN sys.dm_xe_sessions AS xs 
    ON xs.address = xt.event_session_address 
    WHERE xs.name = N'system_health' 
    AND xt.target_name = N'ring_buffer' 
) AS XML_Data 
CROSS APPLY Target_Data.nodes('RingBufferTarget/event[@name="xml_deadlock_report"]') AS XEventData(xed) 
ORDER BY Creation_Date DESC 

Tôi sẽ không đi theo hướng sử dụng (NOLOCK) để sửa chữa sự bế tắc. Đó là độ dốc trơn và che giấu vấn đề ban đầu.