Makale numarası: 832524 - Son Gözden Geçirme: 25 Nisan 2007 Çarşamba - Gözden geçirme: 1.6

SQL Server teknik Bülteni - kilitlenme çözümlemeye nasıl

Sistem İpucuBu makale, kullandığınızdan farklı bir işletim sistemine yöneliktir. Sizinle ilgili olmayabilecek makale içeriği devre dışı bırakıldı.

Bu Sayfada


Hepsini aç | Hepsini kapa

SQL Server teknik Bülteni

Bu sorunu konu kapsadığı: kilitlenme çözmek için

Amaç

Tanımlamak için ilgili sorunları giderme ve kilitlenme çözümlemek için bir çözüm önerilir.

Giriş

Bu makalede, bir kilitlenme durumu inceler ve Kilitlenme Çözümleme için adımları sağlar. Her bir kilitlenme farklı olabilir ve birçok farklı bir ortam değişkeni tarafından kaynaklanabilir. Bu makalede sağlanan bilgiler, tanımlama ve kilitlenme giderme yardımcı olabilir.

Olay incelemesinde

Bir olay incelemesinde altı işleçleri olan 911 bir sistem inceleyeceğiz. En yüksek etkinlik sırasında kullanmakta olduğunuz Microsoft Visual Basic ön uç uygulamasına kopuk bağlantılar karşılaşır. Kopuk bağlantılar nedeniyle, işleçler ve veri re-input gerekir. Günde 24 saat işleyen bir 911 sistem için haftada yedi gün bu kabul edilemez davranıştır.

Kilitlenme nedir?

Iki kilitlenme oluşuyor sistem sunucusunun işlem kimlikleri (Spıd), bir kaynak için bekleyen ve di?er i?lem, kaynak alma gelen engellediğinden, hiçbir işlem ilerleme.

Kilit Yöneticisi çubuğundaki iş parçacığı için kilitlenmeleri denetler. Kilit Yöneticisi çubuğundaki kilitlenme algılama algoritması kilitlenme algıladığında, kilit Yöneticisi bir kurbanı olarak Spıd'ler birini seçer. Istemciye gönderilen 1205 bir hata iletisi kilit Yöneticisi'ni başlatır ve SPID kilidi Yöneticisi kills. SPID sonlandırma kaynakları serbest bırakır ve devam etmek diğer SPıD'NIN sağlar. Kilitlenme kurbanı olan bir SPID sonlandırma olan Visual Basic ön uç uygulama deneyimleri kopuk bağlantı ne neden olmaktadır.

Iyi tasarlanmış bir uygulamada, ön uç uygulamasına 1205 hata için tuzak, SQL Server'a bağlanın ve sonra hareket re-submit.

Kilitlenmeleri indirilebilir, ancak bunlar tümüyle kaçınılması edemiyor. Ön uç uygulamasına kilitlenmeleri işlemeye tasarlanması neden olmasıdır.

Kilitlenme belirleme

Adım 1

Kilitlenme tanımlamak için <a0></a0>, önce günlük bilgileri edinmeniz gerekir. Kilitlenme şüpheleniyorsanız, (Spıd) ve kilitlenme söz konusu kaynaklar hakkında bilgi toplama gerekir. Bunu yapmak için <a0></a0>, ekleyin T1204 ve SQL Server T3605 başlangıç parametreleri. Bu iki Başlangıç parametreleri eklemek için aşağıdaki adımları izleyin:
  • SQL Server Enterprise Manager'ı başlatın.
  • Seçtikten sonra sunucuyu farenin sağ düğmesiyle tıklayın.
  • Özellikler ' i tıklatın.
  • Başlangıç parametreleri ' ı tıklatın.
  • Başlangıç parametreleri iletişim kutusuna yazın -T1204Parametreler metin kutusunu ve sonra Ekle ' yi tıklatın.
  • Parametreleri metin kutusuna girin -T3605 ve sonra Ekle ' yi tıklatın.
  • Tamam ' ı tıklatın.

SQL Server durdurulmuş ve sonra yeniden başlatma parametreleri etkili olur.

-T1204 başlangıç parametresi topladığı bilgileri işlemi ve kilitlenme algılama algoritması kilitlenme karşılaştığında kaynaklar hakkında. T3605 başlangıç parametresi, bu bilgi için SQL Server hata günlüklerini yazar.

T1205 başlangıç parametresi bilgi toplar her için değil, bir kilitlenme karşılaşıldığında kilitlenme kilitlenme algoritması denetler. Kullanmak zorunda T1205 başlangıç parametresi.

Kullanırsanız, T1205 başlangıç parametresi SQL Server hata günlüğüne olacak çıktısının bir örnek aşağıda verilmektedir:

2003-05-14 11:46:26.76 spid4     Starting deadlock search 1
2003-05-14 11:46:26.76 spid4     Target Resource Owner:
2003-05-14 11:46:26.76 spid4      ResType:LockOwner Stype:'OR' Mode: S SPID:55 ECID:0 Ec:(0x43CAB580) Value:0x42bdf340
2003-05-14 11:46:26.76 spid4      Node:1       ResType:LockOwner Stype:'OR' Mode: S SPID:55 ECID:0 Ec:(0x43CAB580) Value:0x42bdf340
2003-05-14 11:46:26.76 spid4     
2003-05-14 11:46:26.76 spid4     End deadlock search 1 ... a deadlock was not found.
2003-05-14 11:46:26.76 spid4     ----------------------------------
2003-05-14 11:46:31.76 spid4     ----------------------------------
2003-05-14 11:46:31.76 spid4     Starting deadlock search 2


Bazı durumlarda, SQL Server iletinizde mümkün olmayabilir. Bu durumda, sorgu çözümleyicisi, kilitlenme izleme bayrağı'nı etkinleştirmek için aşağıdaki komutu çalıştırmak için kullanabilirsiniz.

Not Bu şekilde hemen kilitlenmeleri ile ilgili bilgiler toplayabilirsiniz. "-1" Tüm Spıd'ler gösterir.

dbcc traceon (1204, 3605, -1)
go
dbcc tracestatus(-1)
go

Adım 2

Ardından, SQL Profiler izlemesi toplamanız gerekir. Kilitlenme izleme bayrağı'üzerinde [NULL]'nı açmak için çoğu alırsınız gerekli bilgileri, ancak her zaman değil. Sp_cursoropen Sistem saklı yordamını izleme bayrağı çıkış, bir incelemesinde tanımlanan ve bir "UPDATE tblQueuedEvents notifyid ayarlamak ResynchDate 3 =" ifadesi bir kilitlenmeyle ilgili. Ne yazık ki, sp_cursoropen Sistem saklı yordamını tanımını bilmediğiniz. Kesildi Bunun nedeni, aynı zamanda tam olarak UPDATE deyiminin yetkiniz yok.

SQL Profiler biri yürütme planları ek olarak tam ifadeleri elde edebilirsiniz. SQL Profiler izlemesi "kilitlenme" ve "kilitlenme zinciri.", bir kilit olayı da vardır. "Kilitlenme", T1204 bayrağı karşılık gelir ve "kilitlenme zinciri" T1205 bayrağı karşılık gelir. Kilitlenme izleme bayrakları kapatma ve SQL Profiler izlemesi kilitlenme geçtiği sırasında çalışan bir kilitlenme sorunlarını gidermek için gereken verileri sağlamanız gerekir. Bu durumda ve diğerleri, SQL Profiler'ı çalıştıran kilitlenme engellemeye yeterli çalışma zamanlamasını değiştirir. Bu nedenle, kilitlenme bilgileri izleme bayraklı genellikle yakalama ve SQL Profiler çalıştırın.

Kilitlenme sorunlarını giderme

Kilitlenme oluşuyor sonra sqldiag yardımcı programını kullanarak ve SQL Profiler kullanarak kilitlenme hakkında bilgi toplayabilirsiniz. SQLDiag.txt dosya çıkışı için bir "Bekleme-için-grafik" girdisi olup olmadığına bakın. BIR "bekleme - grafik için" kilitlenme karşılaşıldı girişi gösterir.

Aşağıdaki kullandığınızda, SQL Server hata günlüğünde görebilirsiniz çıktısı örneğidir T1205 başlangıç parametresi.

2003-05-05 15:11:50.80 spid4    Wait-for graph
2003-05-05 15:11:50.80 spid4    Node:1
2003-05-05 15:11:50.80 spid4    ResType:LockOwner Stype:'OR' Mode: S SPID:55 ECID:0 Ec:(0x33AE1538) Value:0x193
2003-05-05 15:11:50.80 spid4    Victim Resource Owner:
2003-05-05 15:11:50.80 spid4    ResType:LockOwner Stype:'OR' Mode: X SPID:60 ECID:0 Ec:(0x1F1BB5B0) Value:0x193
2003-05-05 15:11:50.80 spid4    Requested By: 
2003-05-05 15:11:50.80 spid4    Input Buf: RPC Event: sp_cursoropen;1
2003-05-05 15:11:50.80 spid4    SPID: 55 ECID: 0 Statement Type: EXECUTE Line #: 1
2003-05-05 15:11:50.80 spid4    Owner:0x1937f2a0 Mode: S        Flg:0x0 Ref:1 Life:00000000 SPID:55 ECID:0
2003-05-05 15:11:50.80 spid4    Grant List 0::
2003-05-05 15:11:50.80 spid4    KEY: 8:1653632984:2 (da00ce043a9e) CleanCnt:1 Mode: U Fl ags: 0x0
 
2003-05-05 15:11:50.80 spid4    Node:2
2003-05-05 15:11:50.80 spid4    ResType:LockOwner Stype:'OR' Mode: S SPID:55 ECID:0 Ec:(0x33AE1538) Value:0x193
2003-05-05 15:11:50.80 spid4    Requested By: 
2003-05-05 15:11:50.80 spid4    Input Buf: Language Event: Update tblQueuedEvents Set NotifyID = 2, ResynchDate
2003-05-05 15:11:50.80 spid4    SPID: 60 ECID: 0 Statement Type: UPDATE Line #: 1
2003-05-05 15:11:50.80 spid4    Owner:0x1936e420 Mode: X        Flg:0x0 Ref:0 Life:02000000 SPID:60 ECID:0
2003-05-05 15:11:50.80 spid4    Grant List 0::
2003-05-05 15:11:50.80 spid4    KEY: 8:1653632984:1 (2d018af70d80) CleanCnt:1 Mode: X Flags: 0x0


"Bekleme-için-grafik" girdisinde, düğüm 1 ve düğüm elinizde 2. Her düğüm, grant bölüm ve bir istek bölümü vardır. Grant bölümünde "Ver liste" ve istek bölümünde "İstekleri olarak."
Her düğüm, aşağıdakileri tanımlayabilirsiniz:
  • SPID.
  • SPID, komutu yürütmeden.
  • Kaynak.
  • Kaynak üzerindeki kilit modu.

Örneğin, liste verme, düğüm 1 SPID 55 bir güncelleştirme kilit modu verilen: U, <a1>kaynak</a1> ANAHTARı: 8:1653632984:2. 8 DBID, 1653632984 = NesneKimliği ve 2 = Indid =. Veritabanı kimliği numarası edinmek için <a0></a0>, sp_helpdb saklı yordamı çalıştırın. Tablo almak için <a0></a0>, aşağıdaki kodu çalıştırın:
select * from sysobjects where id = 1653632984


Dizin'i edinmek için aşağıdaki kodu çalıştırın:
select * from sysindexes where indid = 2 and id = 1653632984

IndexId 2'ye eşitse, kümelenmemiş bir dizin dizinidir biliyor. SPID 55 yürütme komutu sp_cursoropen depolanmış yordamın oldu.

Düğüm 2 ver listesinde, bir özel kilit modu SPID 60 verildi: X için <a1>kaynak</a1> ANAHTARı: 8:1653632984:1. 8 DBID, 1653632984 = NesneKimliği, 1 = Indid =. Bu, aynı tabloda, ancak 1 kümelenmiş dizin dizinidir. SPID 60 yürütme komutu şuydu:
Update tblQueuedEvents Set NotifyID = 2, ResynchDate

1'E eşit olan bir IndexId kümelenmiş bir dizin olur.

2'Ye eşit olan bir IndexId kümelenmemiş bir dizindir.

Not Kilitlenmeleri çok zaman duyarlı olur.

Ardından, düğüm 1'de, isteği olarak paylaşılan bir kilit modu SPID 55 istedi: IndexId üzerinde S = 1. Düğüm 2'de, Bir özel kilit modu istek göre SPID 60 istedi: X, IndexId = 2. Bu, lock istekleri, aynı anda ortaya, kilitlenme oluşur. Her SPID verilen kilitlerin istenen kilit devam etmesini engelliyor.

Aşağıdaki tabloda, kilit uyumluluğu grafik gösterir. Kilit uyumluluğu hakkında daha fazla bilgi için SQL Server 2000 Books Online'da "Lock Compatibility" konusuna bakın.

Kilit uyumluluğu grafik
Bu tabloyu kapaBu tabloyu aç
Istenen modOLANsuixALTIx
Hedefi (IS) paylaşılan...EVETEVETEVETEVETEVETHayır
Paylaşılan (S)EVETEVETEVETHayırHayırHayır
Güncelleştirme (U) EVETEVETHayırHayırHayırHayır
Özel kullanım amacını (IX)EVETHayırHayırEVETHayırHayır
Amacı ile özel (SIX) paylaşılan EVETHayırHayırHayırHayırHayır
Özel (X)HayırHayırHayırHayırHayırHayır


Sonra çıkış bakarak, Objectıd 1653632984 tblQueuedEvents tablo olarak tanımlamak ve tablo için çıkış sp_help depolanmış yordam edinin. Tabloyu iki dizini vardı. Iki dizini ix_tblQueuedEvents ve PK_tblQueuedEvent bulunuyordu. ix_tblQueuedEvents ResynchDate kümelenmiş bir dizin ve PK_tblQueuedEvent EventSID benzersiz kümelenmemiş dizin birincil bir anahtar.

Kilitlenme oluşumu yakalamak SQL Profiler izlemesi başaramadı. Kilitlenmeleri çok zaman bağımlı olduğunu unutmayın. SQL Profiler, yükü büyük bir olasılıkla bir işlemlerin yürütülmesi için biraz zaman eklenir ve bir kilitlenme durumda alma gelen, SQL Profiler engelledi. Ancak, sorunu gidermek için kullanabileceğiniz bilgileri sağlaması. Aşağıdakine benzer olacak şekilde tam güncelleştirme tblQueuedEvents ifadesi bulunan:

Update tblQueuedEvents Set NotifyID = 2, ResynchDate = '5/7/2003 10:44:16' where eventSID = 73023
Ayrıca, yürütme planı bulundu. Yine de tam sp_cursoropen depolanmış yordamın deyimi yoktur, ancak kilitlenme gideren çözüm önermek için yeterli bilgiye sahip.

Yürütme planı olur.

Not Bu özel yürütme planı okuma sağdan sola hem üst, alt.

StmtText                                                      
				                                                                           
				   
				                                  
--------------------------------------------------------------------------------------------------------------------------------------------------------------------
				
Update tblQueuedEvents Set NotifyID = 2, ResynchDate = '5/7/2003 10:44:16'
				where eventSID = 73023                                                     
				   
				                    
|--Clustered Index
				Update(OBJECT:([SOTS].[dbo].[tblQueuedEvents].[ix_tblQueuedEvents ]),
				SET:([tblQueuedEvents].[NotifyID]=[@1],
				[tblQueuedEvents].[ResynchDate]=[Expr1004]))  
     |--Top(1)                                                                 
				                                                                           
				   
				               
           |--Compute Scalar(DEFINE:([Expr1004]=Convert([@2])))                
				                                                                           
				   
				                
                 |--Index
				Seek(OBJECT:([SOTS].[dbo].[tblQueuedEvents].[PK_tblQueuedEvents]),
				SEEK:([tblQueuedEvents].[EventSID]=[@3]) 

Kilitlenme çözümlemek için bir çözüm önerilir.

UPDATE deyimi kümelenmiş dizin üzerinde "kümelenmiş bir dizin güncelleştirme" gerçekleştiriyor unutmayın. Bu nedenle, kümelenmemiş dizin ve kümelenmiş dizin her ikisi de güncelleştirilmesi gerekmektedir. Kümelenmiş dizin ix_tblQueuedEvents ve kümelenmemiş dizin PK_tblQueuedEvents. UPDATE deyimi güncelleştirmeler gerçekleştirmek için <a0></a0>, her iki dizin üzerinde özel kilit edinmelisiniz. Bu iki dizinler kilitlenme söz konusu dizinleri ' dir. SQL Profiler izleme gözden geçirme gelen, ResynchDate WHERE yan tümcesinde kullanılan sorguları gördünüz mü değil. Ifadeleri çok özel ve bunlar EventSID WHERE yan tümcesinde kullanılan. Kümelenmiş bir dizin için daha iyi BIR seçim EventSID olacaktır. Bu bilgiler ve tartışmayı müşteriyle ResynchDate dizin eski ve gerekli değildi bulundu. Müşteri ix_tblQueuedEvents dizin ResynchDate üzerinde bırakın ve bunlar PK_tblQueuedEvent kümelenmiş bir dizin olun önerilir. Bu, kilitlenme durumu çözümlendi.

Bu kilitlenme talebinin kilitlerin içeren yalnızca bir örnektir. Kilitlenmeleri de parallelism içerir ve iş parçacığı içerir. Bir, iki, üç veya daha fazla Spıd'ler ve kaynakları içerebilir. Herhangi bir kilitlenme harf ile –T1204 başlangıç parametresi çıktı ve SQL Profiler izleme tanımlamak için sorun giderme ve kilitlenme çözümlemeye edinmelisiniz. Kilitlenme durumunuza farklı işlemler ve kaynaklar içerir. Bu nedenle, çözümleri arasında büyük/küçük harf durumu değişir. Kilitlenmeleri çözümlemek için kullanabileceğiniz genel yöntemleri şunlardır:
  • Ekleme ve dizinler bırakılıyor.
  • Dizin ipucu ekleme.
  • Benzer bir yol kaynaklara erişmek için uygulamanın değiştiriliyor.
  • Tetikleyiciler gibi işlem etkinliğini kaldırma. Varsayılan olarak, Tetikleyicileri, işlem kullanılabilir.
  • Hareketleri olabildiğince kısa tutmak.

Ek okuma

Kilitlenmeleri hakkında daha fazla bilgi için aşağıdaki Microsoft Web sitelerini ziyaret edin:

http://msdn2.microsoft.com/en-us/library/Aa213040 (http://msdn2.microsoft.com/en-us/library/Aa213040)

http://msdn2.microsoft.com/en-us/library/aa213042(SQL.80).aspx (http://msdn2.microsoft.com/en-us/library/aa213042(SQL.80).aspx)

http://msdn2.microsoft.com/en-us/library/aa213028(SQL.80).aspx (http://msdn2.microsoft.com/en-us/library/aa213028(SQL.80).aspx)

http://msdn2.microsoft.com/en-us/library/aa937573(SQL.80).aspx (http://msdn2.microsoft.com/en-us/library/aa937573(SQL.80).aspx)

http://msdn2.microsoft.com/en-us/library/aa213041(SQL.80).aspx (http://msdn2.microsoft.com/en-us/library/aa213041(SQL.80).aspx)

Bu makaledeki bilginin uygulandığı durum:
  • Microsoft SQL Server 2000 Standard Edition
Otomatik TercümeOtomatik Tercüme
ÖNEMLİ: Bu makale, bir kişi tarafından çevrilmek yerine, Microsoft makine-çevirisi yazılımı ile çevrilmiştir. Microsoft size hem kişiler tarafından çevrilmiş, hem de makine-çevrisi ile çevrilmiş makaleler sunar. Böylelikle, bilgi bankamızdaki tüm makalelere, kendi dilinizde ulaşmış olursunuz. Bununla birlikte, makine tarafından çevrilmiş makaleler mükemmel değildir. Bir yabancının sizin dilinizde konuşurken yapabileceği hatalar gibi, makale; kelime dağarcığı, söz dizim kuralları veya dil bilgisi açısından yanlışlar içerebilir. Microsoft, içeriğin yanlış çevrimi veya onun müşteri tarafından kullanımından doğan; kusur, hata veya zarardan sorumlu değildir. Microsoft ayrıca makine çevirisi yazılımını sıkça güncellemektedir.
Makalenin İngilizcesi aşağıdaki gibidir:832524  (http://support.microsoft.com/kb/832524/en-us/ )