Kilitlenme hatası kilitlenme SQL'i döndürmüyor


13

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

Web sitelerimden biri meşgul olduğunda bu hatayı rastgele alıyorum. Kabaca hangi tablolar üzerinde olduğunu biliyorum ama diğer programlar ile benim deneyim normalde kilitlenme oluyor nerede SQL iade olsun. Bunun olmasına izin vermek için açmam gereken bir bayrak var mı?

Şimdilik ana sorum olduğu için çıkmazın kendisini ayrı bir sorun olarak çözmeye çalışacağım.

SQL Server 2008 Standard Edition kullanıyorum.


Hizmeti yeniden başlatabiliyor musunuz? Hizmeti zıplayabiliyorsanız, kilitlenme ayrıntılarını SQL Server günlüğüne kaydetmek için başlangıç ​​parametrelerine izleme bayrağı 1204 ekleyebilirsiniz. > 1204: Bir kilitlenmeye katılan kilitlerin kaynaklarını ve türlerini ve ayrıca etkilenen geçerli komutu döndürür. Kapsam: sadece küresel
Tevo D

1
Yapılandırma yöneticisini kullanın. SQL Server Hizmetleri altında, özellikleri sağ tıklatın ve açın. Gelişmiş sekmesine, başlangıç ​​parametrelerine gidin. Ana veritabanı dosyalarının ve benzeri konumların girişleri olacaktır. ;-T1204İzleme bayrağını sonlandırıp hizmeti yeniden başlatmak için ekleyin .
Tevo D

4
Hizmeti neden yeniden başlatmalıyım? DBCC TRACEON (1204, -1)
Mark Storey-Smith

Gönderen msdn.microsoft.com/en-us/library/ms188396.aspx : Davranış Değişiklikleri: SQL Server 2000, basit bir DBCC TRACEON (1204) hatası günlüğüne kilitlenme raporlamayı etkinleştirmek için yeterlidir. SQL Server 2008'de, oturum düzeyi bayrağı çıkmaz monitör iş parçacığı tarafından görülemediği için bayrağı genel olarak etkinleştirmeniz gerekir.
Tevo D

2
@TevoD - Global anlamına gelen -1parametre DBCC TRACEON.
Martin Smith

Yanıtlar:


25

İhtiyacınız olan veriler varsayılan genişletilmiş olaylar izine kaydedilir.

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

Bir izleme bayrağı uygulamak için -eg hizmetini yeniden başlattıysanız veya arabellek bu arada döngü yaptıysa artık olmayacak.

Kalıcı grafiği sürekli kalıcı depolama için bir dosya hedefinde saklayan kendi genişletilmiş olay izinizi ayarlayabilirsiniz. Örnek Kod burada . Ben şahsen deadlock grafik XML izleme bayrak çıktı daha kolay buluyorum.

Düzenle

  1. @MartinC , tüm güncellemelere sahip olmayan SQL Server örneklerinde geçersiz XML oluşturmada bir sorun olabileceğini belirtiyor. Bunun için düzeltme bazı arama yapmak ve değiştirme ve kullanmaktır 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 DeadlockGraphde SELECTlisteye burada açıklandığı gibi .
  2. Wayne Sheffield, kilitlenme grafiği XML'sini burada tablo biçiminde parçalamak için yararlı bir komut gönderdi .

Ne yazık ki, EE tüm kilitlenmeleri yakalamıyor ve bir hata gibi görünüyor: connect.microsoft.com/SQLServer/feedback/details/754115/…
Matt

3

Kabul edilen cevap benim için tutarlı bir şekilde çalışmadı. Halka tamponunun belli durumlarda olayları düşürdüğü bilinmektedir.

ConnectItem

Ring Buffer Sorunları

System_health günlük olay dosyaları ayrıştırılabilir ( bu yanıttan ):

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

XdlFile alanı bir .xdl dosyasına kaydedilebilir ve SSMS'ye okunabilir. Sql Server 2012'de test edilmiştir.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.