Lỗi bế tắc không trả về SQL bế tắc


13

Transaction (Process ID) was deadlocked on lock resources with another process and has been chosen as the deadlock victim. Rerun the transaction.

Tôi nhận được lỗi này một cách ngẫu nhiên khi một trong những trang web của tôi bận rộn. Tôi biết đại khái là tập hợp các bảng đang diễn ra nhưng theo kinh nghiệm của tôi với các chương trình khác, tôi thường nhận được SQL trả về nơi xảy ra bế tắc. Có một lá cờ tôi nên bật để cho phép điều này xảy ra?

Tôi sẽ cố gắng và gỡ lỗi bế tắc như một vấn đề riêng biệt vì đây là câu hỏi chính của tôi bây giờ.

Tôi đang sử dụng SQL Server 2008 Standard Edition.


Bạn có thể khởi động lại dịch vụ không? Nếu bạn có thể thoát dịch vụ, bạn có thể thêm cờ theo dõi 1204 vào các tham số khởi động của mình để ghi nhật ký chi tiết của bế tắc vào nhật ký Máy chủ SQL. > 1204: Trả về tài nguyên và các loại khóa tham gia vào bế tắc và cũng là lệnh hiện tại bị ảnh hưởng. >> Phạm vi: chỉ toàn cầu
Tevo D

1
Sử dụng trình quản lý cấu hình. Trong SQL Server Services, nhấp chuột phải và mở thuộc tính. Chuyển đến tab Nâng cao, thông số khởi động. Bạn sẽ có các mục cho vị trí của các tệp cơ sở dữ liệu chủ và như vậy. Thêm ;-T1204cho cờ theo dõi để kết thúc và khởi động lại dịch vụ.
Tevo D

4
Tại sao phải khởi động lại dịch vụ? DBCC TRACEON (1204, -1)
Mark Storey-Smith

Từ msdn.microsoft.com/en-us/l Library / ms188394.aspx : Thay đổi hành vi: Trong SQL Server 2000, một DBCC TRACEON đơn giản (1204) là đủ để cho phép báo cáo bế tắc vào nhật ký lỗi. Trong SQL Server 2008, bạn phải bật cờ trên toàn cầu vì cờ cấp phiên không hiển thị đối với luồng màn hình khóa chết.
Tevo D

2
@TevoD - -1Tham số để DBCC TRACEONbiểu thị toàn cầu.
Martin Smith

Câu trả lời:


25

Dữ liệu bạn cần được ghi lại trong dấu vết sự kiện mở rộng mặc định.

DECLARE @xml XML

SELECT @xml = target_data
FROM   sys.dm_xe_session_targets
       JOIN sys.dm_xe_sessions
         ON event_session_address = address
WHERE  name = 'system_health'
       AND target_name = 'ring_buffer'

SELECT   
             XEventData.XEvent.query('(data/value/deadlock)[1]')  AS DeadlockGraph,
             CAST(XEventData.XEvent.value('(data/value)[1]', 'varchar(max)') AS XML) AS DeadlockGraph,
              XEventData.XEvent.value('(./@timestamp)[1]', 'DATETIME2') AS [DateTime]
FROM   (SELECT @xml AS TargetData) AS Data
       CROSS APPLY 
       TargetData.nodes ('RingBufferTarget/event[@name="xml_deadlock_report"]') AS XEventData (XEvent) 
ORDER BY [DateTime] DESC

Mặc dù nó sẽ không còn nữa nếu bạn đã khởi động lại dịch vụ -eg để áp dụng cờ theo dõi hoặc nếu bộ đệm đã đạp trong thời gian đó.

Bạn có thể thiết lập theo dõi các sự kiện mở rộng của riêng mình để lưu trữ biểu đồ khóa chết vào mục tiêu tệp để lưu trữ không bay hơi liên tục. Mã ví dụ ở đây . Cá nhân tôi thấy đồ thị bế tắc XML thân thiện hơn so với đầu ra cờ theo dõi.

Biên tập

  1. @MartinC chỉ ra trong các nhận xét rằng trong các phiên bản SQL Server không có tất cả các bản cập nhật có thể có vấn đề với việc tạo XML không hợp lệ. Cách khắc phục là thực hiện một số tìm kiếm, thay thế và sử dụng CAST(REPLACE(REPLACE(XEventData.XEvent.value('(data/value)[1]', 'varchar(max)'), '<victim-list>', '<deadlock><victim-list>'), '<process-list>', '</victim-list><process-list>') AS XML) AS DeadlockGraphtrongSELECT danh sách như được mô tả ở đây .
  2. Wayne Sheffield đã đăng một tập lệnh hữu ích để cắt XML đồ thị bế tắc thành định dạng bảng ở đây .

Đáng buồn thay, EE không nắm bắt được tất cả các bế tắc và dường như là một lỗi: connect.microsoft.com/QueryServer/feedback/details/754115/ trộm
Matt

3

Câu trả lời được chấp nhận không làm việc cho tôi một cách nhất quán. Bộ đệm vòng rõ ràng được biết là bỏ các sự kiện trong một số trường hợp nhất định ..

Kết nối

Các vấn đề về bộ đệm

Các tệp sự kiện nhật ký system_health có thể được phân tích cú pháp (từ câu trả lời này ):

with XmlDeadlockReports as
(
  select convert(xml, event_data) as EventData
  from sys.fn_xe_file_target_read_file(N'system_health*.xel', NULL, NULL, NULL)
  where substring(event_data, 1, 50) like '%"xml_deadlock_report"%'  
) 
select EventData.value('(event/@timestamp)[1]', 'datetime2(7)') as TimeStamp,
       EventData.query('event/data/value/deadlock') as XdlFile
  from XmlDeadlockReports
 order by TimeStamp desc

Trường XdlFile có thể được lưu vào tệp .xdl và đọc vào SSMS. Đã thử nghiệm trong Sql Server 2012.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.