Aracılığıyla paylaş


Deadlocking

Iki veya daha fazla kalıcı olarak görevleri çıkmaz oluşuyor blok birbirine kilit kilitlemek için diğer görevler çalıştığınız üzerinde bir kaynağa sahip her görev tarafından.Örneğin:

  • BIR hareket, satır 1'üzerinde bir paylaşım kilit edinme.

  • Işlem B satır 2'üzerinde bir paylaşım kilit edinme.

  • Hareket BIR şimdi istekleri bir özel kullanım kilidi üzerinde 2 satır ve B işlem tamamlanır ve 2. satırda bulunan paylaşım kilidi býrakýr kadar engellenir.

  • Işlem B satır 1'üzerinde özel bir kilit istekleri ve BIR hareket tamamlandıktan ve 1 numaralı satırda bulunan paylaşım kilidi býrakýr kadar engellenir.

Işlem A, B işlem tamamlanır, ancak B işlem YANıT işlem tarafından engellendi kadar tamamlanamıyor.Bu durum, döngüsel bir bağımlılık olarak da adlandırılır: Hareket A B harekette bir bağımlılık vardır ve hareket B daire A. harekette bağımlılık sağlayarak kapatır

çıkmaz dış bir işlem tarafından ayrılmış sürece, her iki hareket içinde bir çıkmaz sonsuza kadar bekleyecektir.The Microsoft SQL Server Database Engine deadlock monitor periodically checks for tasks that are in a deadlock.Monitör döngüsel bağımlılık saptarsa görevlerden birini bir kurban olarak seçer ve kendi işlem bir hata ile sona erdirir.Bu, hareketi tamamlamak diğer görev sağlar.Uygulama bir hata ile sona erdi hareket deadlocked diğer hareket tamamlandıktan sonra genellikle tamamlar hareket deneyebilir.

Uygulamaların belirli bir kodlama kurallarını kullanarak, uygulamaları kilitlenmeleri oluşturacağını olasılığını azaltır.Daha fazla bilgi için bkz:Kilitlenmeleri en aza indirme.

Deadlocking genellikle normal engelleme ile karışmış.Kilidin yayımlanıncaya kadar bir işlemin başka bir işlem tarafından kilitli kaynak üzerindeki kilit istediğinde, istekte bulunan işlem bekler.Varsayılan olarak, SQL Server LOCK_TIMEOUT olmadığı sürece, hareketlerin saat aşımına yapmak küme. Istekte bulunan işlem kilit olan işlem engellemek için herhangi bir şey yapmanız değil çünkü deadlocked değil, istekte bulunan işlem engellendi.Sonuçta, ilgili hareketi tamamlamak ve kilit ve sonra istekte bulunan işlem kilit verileceğini ve devam edin.

Kilitlenmeler, bazen bir deadly embrace verilir.

çıkmaz, yalnızca bir ilişkisel veritabanı yönetim sistemi üzerinde birden çok iş parçacığı ile herhangi bir sistem oluşabilir ve veritabanı nesneleri üzerinde kilit farklı kaynaklar için oluşabilir bir koşuldur.Örneğin, bir iş parçacığı bir çok iş parçacıklı işletim sistemi bellek bloğu gibi bir veya daha fazla kaynak elde.Alınmış kaynak şu anda başka bir iş parçacığı tarafından aitse, ilk iş parçacığının hedef kaynağı serbest bırakmak ilgili iş için beklemeniz gerekebilir.Bekleyen iş parçacığı, bu belirli kaynağa sahip iş parçacığı için bir bağımlılık denir.örnek, Database Engine, bellek veya iş parçacıkları gibi nondatabase kaynaklar alınıyor, oturumların kilitlenmeye.

Diagram showing transaction deadlock

T2 hareketinde için çizimde işlem T1 bir bağımlılık vardır Bölümü tablo kilit kaynak.Benzer şekilde, işlem T2 T1 hareketinde için bir bağımlılık vardır Tedarikçi tablo kilit kaynak.Bir döngü bu bağımlılıkları oluşturmak için hareketler arasında ve T1 T2 çıkmaz yoktur.

Kilitlenmeler, tablo bölümlendirilir ve ALTER TABLE LOCK_ESCALATION küme ting olduğunda da oluşabilir küme AUTO için.LOCK_ESCALATION için OTOMATIK olarak ayarlandığında, eşzamanlılık sağlayarak artırır Database Engine Tablo bölümleri TABLE düzeyinde yerine HoBT düzeyinde kilitlemek için . Ancak, ayrı işlemler bölüm kilitli bir tabloda tutmak ve kilit yerlerde bölümdeki diğer hareketleri istediğinizde, bu bir çıkmaz olur.Bu ayar, bir bölüm için bir tablo kilit beklenecek büyük güncelleştirmeleri zorlayarak eşzamanlılık azaltır, ancak bu tür bir çıkmaz TABLE için; LOCK_ESCALATION ayarlayarak kaçınılması.