Aynı sorguları korurken kilitlenmeyi önlemenin bir yolu var mı?
Kilitlenme grafiği, bu özel kilitlenmenin bir yer işareti aramasıyla ilişkili bir dönüşüm kilitlenmesi olduğunu gösterir (bu durumda bir RID araması):
Soruda belirtildiği gibi, genel kilitlenme riski ortaya çıkar çünkü sorgular farklı kaynaklarda aynı kaynaklar üzerinde uyumsuz kilitler elde edebilir. SELECT
Sorgu oysa nedeniyle RID arama masaya önce endeksi erişmesi gereken UPDATE
sonra, tablo ilk sorgu tuşelere indeksi.
Kilitlenmenin giderilmesi için kilitlenme bileşenlerinden birinin kaldırılması gerekir. Ana seçenekler şunlardır:
- Kümelenmemiş dizin kaplaması yaparak RID aramasından kaçının.
SELECT
Sorgunuz 26 sütun döndürdüğünden , bu durum büyük olasılıkla pratik değildir .
- Kümelenmiş bir dizin oluşturarak RID aramasından kaçının. Bu, sütunda kümelenmiş bir dizin oluşturmayı içerir
Proposal
. Bu sütun, uniqueidentifier
daha geniş sorunlara bağlı olarak, kümelenmiş bir dizin için iyi bir seçim olabilecek veya olmayabilecek türde bir tür gibi görünse de, dikkate değerdir .
READ_COMMITTED_SNAPSHOT
Veya SNAPSHOT
veritabanı seçeneklerini etkinleştirerek okurken paylaşılan kilitler almaktan kaçının . Bu, özellikle tasarlanmış engelleme davranışlarıyla ilgili olarak dikkatli testler yapılmasını gerektirir. Tetik kodunun ayrıca mantığın doğru çalıştığından emin olmak için test edilmesi gerekir.
- Sorgu
READ UNCOMMITTED
için yalıtım düzeyini kullanarak okurken paylaşılan kilitler almaktan kaçının SELECT
. Tüm olağan uyarılar geçerlidir.
- Özel bir uygulama kilidi kullanarak söz konusu iki sorguyu aynı anda yürütmekten kaçının (bkz. Sp_getapplock ).
- Eşzamanlılığı önlemek için tablo kilidi ipuçlarını kullanın. Bu, seçenek 5'ten daha büyük bir çekiçtir, çünkü yalnızca soruda tanımlanan iki sorguyu değil, diğer sorguları da etkileyebilir.
Tablo ve dizin erişiminin aynı sırada olduğundan emin olmak için güncellemeden önce bir şekilde güncelleme işleminde dizine X-Lock alabilir miyim
Güncellemeyi açık bir işlemde sararak ve güncellemeden önce kümelenmemiş dizin değeri üzerinde SELECT
bir XLOCK
ipucu yaparak bunu deneyebilirsiniz . Bu, kümelenmemiş dizindeki mevcut değerin ne olduğunu kesin olarak bilmenize, yürütme planını doğru hale getirmenize ve bu ekstra kilidi almanın tüm yan etkilerini doğru bir şekilde tahmin etmenize bağlıdır. Ayrıca, yedek motorun, gereksiz olduğu düşünülürse kilidi almayı engelleyecek kadar akıllı olmamasına da bağlıdır .
Kısacası, bu prensipte uygulanabilir olsa da, tavsiye etmiyorum. Bir şeyi kaçırmak ya da yaratıcı yollarla kendini alt etmek çok kolaydır. Bu kilitlenmelerden gerçekten kaçınmanız gerekiyorsa (sadece onları tespit edip yeniden denemek yerine), yukarıda listelenen daha genel çözümlere bakmanızı öneririm.