Engelleme nedir ve nasıl olur?


20

SQL Server'da engelleme hakkında bazı bilgiler bulmaya çalıştım, ancak ne olduğu ve nasıl olduğu hakkında kısa bir açıklama bulamadım. Lütfen beni aydınlatır mısın?

Yanıtlar:


23

Benzerlikler

Bazen analojileri bilgisayarlardan uzak tutmaya yardımcı olur.

Bir topunuz ve iki çocuğunuz olduğunu varsayalım. Herhangi bir anda yalnızca bir çocuk topa sahip olabilir. Bununla birlikte, çocuklardan biri topu alırsa ve dikkatinin dağıldığı için serbest bırakmazsa (örneğin, televizyon izlerken), o zaman diğer çocuk topla oynamayacaktır.

Diğer çocuk bu kaynaktan engelleniyor.

Bunu televizyonla karşılaştırırsak, örneğin, birkaç çocuk herhangi bir noktada TV izleyebilir.

Kilitler

Veritabanı dünyasına geçersek, kaynakları kullanmanın farklı yolları olduğunu görüyoruz (tıpkı yukarıdaki iki örneğimiz gibi). "Okuma" yapabiliriz veya "yazma" yapabiliriz.

Verileri okumak istediğimizde, diğerlerinin de verileri okuyamaması için bir neden yoktur - tıpkı TV izleyen iki kişi gibi. Ancak, verileri yazmak istiyorsak, başka kimsenin bakmadığından emin olmamız gerekir. Biz yazarken okuyorlarsa, "kirli" okurlar. (Anlamı, verileri kısmen yazılmış, geçersiz olacaklarını göreceklerdir.)

Bu kirli okumaların asla gerçekleşmemesini sağlamak için iki ana kilit tipimiz vardır: Okuma Kilitleri ve Özel Kilitler.

Okuma Kilidi

Herhangi bir zamanda aynı veri kaynağından okunan farklı bağlantılara sahip olabilirsiniz. Ancak hiç kimsenin bu verileri okurken değiştirmemesini sağlamak için bir Okuma Kilidi alırlar.

Bir bağlantı verilerinin bir parçası üzerinde bir okuma kilitlendikten sonra onlar önce Okuma Kilidi serbest bırakılıncaya kadar, diğer bütün bağlantıları beklemesi gerektiğini yazma verileri. Ancak diğerleri aynı veri parçası üzerinde kendi Okuma Kilitlerini alabilirler.

Özel Kilit

Bir bağlantı bir veri parçasını güncellemek / eklemek / silmek istiyorsa, özel bir kilitleme yapmaları gerekir. Bu, başka herhangi bir bağlantının da verileri kilitlemesini önler (kilidi bu bağlantıya özel kılar).

Bir bağlantının veriler üzerinde özel bir kilidi varsa, verilerden başka hiçbir bağlantı okunamaz. Bu, yazılan verileri kimsenin okuyamayacağından emin olarak kirli okumaların önlenmesine yardımcı olur.

bloke etme

"Engelleme", başka bir bağlantı okumak veya yazmak istediğinde, bir bağlantının bir kaynak üzerinde bir kilit tuttuğu anlamına gelen bir terimdir. Bu, mutlaka sahibi bağlantısının onu serbest bırakmayacağı anlamına gelmiyor, şu anda elinde tutuyor.

Topu tutan bir çocukla bunu karşılaştırın. Topu tutan çocuk, diğer tüm çocukların topu tutmasını engelliyor.

çıkmaz

Bunu sormadığını biliyorum, ama kilitlenmelere ulaşmak için sadece bir adım daha kaldı (ve doğrudan engelleme ile ilgili).

Kilitlenmeler, her birinin kilidi olan iki bağlantınız olduğunda gerçekleşebilir, ancak birbirlerinin kaynağını ister. Bu senaryoda, her birinin bir topu olduğu, ancak diğerinin topunu istediği iki çocuk gibi.

Çocuklar gibi bu bağlantılar da hiç paylaşmak istemiyor. Devam etmek için her bağlantının her iki kaynağa da erişmesi gerekir. Bununla birlikte, kalıcı bir engelleme durumundalar. Bu durumda, üst (DBMS) içeri girmeli ve bir kaybeden seçmelidir, böylece çocuklardan biri (bağlantılar) her iki kaynağa da erişebilir.

Bu "kazanan" bağlantı yapıldıktan sonra, kaynakları serbest bırakır ve diğer ("kaybeden") bağlantı her iki kaynağa ulaşmak için tekrar deneyebilir.

Yani, kilitlenme kavramı, birbirinizi engelleyen iki kaynağınızın olduğu yerdir.


Burada , SQL Server'ın sunduğu tüm kilitleme kilitleri ve kilitlenmeye / kilitlenmeye neden olabilecek farklı kaynaklar hakkında daha fazla bilgi edinebilirsiniz. Makale eski, ancak yine de SQL Server 2000 ile 2008 R2 için geçerlidir. (SQL Server'ın sonraki sürümlerine eklenen birkaç kilit türü daha vardır, ancak bu size bir başlangıç ​​noktası verecektir.)


1
@Richard, bir kilitlenme meydana geldiğinde bahsettiğiniz gibi, o zaman DBMS gelir ve bir kaybeden seçer .. Bu DBMS tarafından otomatik olarak yapılır mı? Ya da kötü tasarlanmış bir sistem (sık sık kilitlenme yaşayan bir sistem), bir kişi bunu yapmak için DBMS'yi başlatana kadar durur mu?
CenterOrbit

2
SQL Server için bu otomatik olarak yapılır (veritabanı kilitlenmeyi algılayabilirse ). Örneğin, gerçekte canlı bir kilit ise algılamada sorun yaşayabilir .
Richard

Mükemmel ve çok kapsamlı cevap Richard. Canlı kilitler üzerine bir başka nokta (gerçekten kilitlenmelerle karşılaştırılmamalı veya kilitlenmelerle ilgili olmamalıdır, sadece eski düz engelleme) ... SQL, üst üste binen 4 paylaşılan kilitlemenin ardından özel bir kilidin beklediği yerde daha fazla kilit alınmasını, IIRC'yi önleyecektir.
Mark Storey-Smith

5

Richard tarafından büyük açıklama, ama sadece resmi belgelere bağlantılar eklemek istedim. Bu konular SQL Server 2000 için yazılmıştır, ancak kavramların çoğu bugün aynıdır:

Engellemeyi Anlama ve Engelleme

SQL Server'da Kilitlemeyi Anlama

Düzenle - bazı eklemeler:

Her üçü de çok iyi bilinen SQL Server yazarları ve / veya MVP'lerdir.

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.