SORU
21 AĞUSTOS 2008, PERŞEMBE


SQL teşhis Kilitlenmeleri 2005 Server

Bazı zararlı görüyoruz, ama Yığın Taşması SQL Server 2005 veritabanında nadir, kilitlenme koşulları.

Profiler ekledim, bir izleme profili this excellent article on troubleshooting deadlocks kullanarak kurmak ve örnek bir grup ele geçirdi. Garip bir şey bubu deadlocking yazmakher zamanaynı:

UPDATE [dbo].[Posts]
SET [AnswerCount] = @p1, [LastActivityDate] = @p2, [LastActivityUserId] = @p3
WHERE [Id] = @p0

Diğer deadlocking ifadesi değişir, ama genellikle önemsiz, basit bir türokuyunmesajlar tablo. Bu her zaman çıkmaz içinde öldürülüyor. İşte size bir örnek

SELECT
[t0].[Id], [t0].[PostTypeId], [t0].[Score], [t0].[Views], [t0].[AnswerCount], 
[t0].[AcceptedAnswerId], [t0].[IsLocked], [t0].[IsLockedEdit], [t0].[ParentId], 
[t0].[CurrentRevisionId], [t0].[FirstRevisionId], [t0].[LockedReason],
[t0].[LastActivityDate], [t0].[LastActivityUserId]
FROM [dbo].[Posts] AS [t0]
WHERE [t0].[ParentId] = @p0

Açıklığa kavuşturalım, yazma / yazma kilitlenmeleri görmüyoruz, ama okuma / yazma.

SERİ bir karışım var ve şu anda SQL sorgu parametreli. Tüm SQL sorguları with (nolock) ekledik. Bu biraz yardımcı olabilir. Biz de yukarı 20 her zaman çalıştırmak için saniye oldu dün tamir ettim ve bunun üzerine her dakika çalışan çok beceriksizce yazılmış rozet tek bir sorgu vardı. Bu kilitleme bazı sorunların kaynağı umuyordum!

Ne yazık ki, başka bir kilitlenme hata yaklaşık 2 saat önce aldım. Aynı belirtiler, aynı suçlu yazın.

Gerçekten garip olan şey yukarıda gördüğünüz kilitleme yazma SQL deyimi çok özel bir kod yolu bir parçası olmasıdır.sadeceyeni bir cevap bir soru yeni Cevap Sayısı ve son tarih sağlar üst soru eklendiğinde idam/kullanıcı. Bu, açıkçası, bu ortak yapıyoruz okur muazzam sayıda göredir! Söyleyebileceğim kadarıyla, yazar uygulaması her yerinde çok sayıda yapmıyoruz.

NOLOCK dev bir çeşit çekiç, ama burada çalıştırmak en doğru gerek olmadığını fark ettim. Eğer kullanıcı profilinize güncel bir kaç saniye ise umurunda mı?

Seri ile NOLOCK kullanarak Scott Hanselman discusses here biraz daha zordur.

Kullanma fikri ile flört ediyoruz

SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED

tüm SERİ bizim bu sorgu kümesi temel veritabanı bağlamı. O olmadan, yapmak zorundayız wrap her SERİ arama yapalım (iyi, basit okuma olanlar, ki büyük çoğunluğu onları) bir işlem 3-4 satır kod bloğu olduğu çirkin.

Önemsiz 2005 yazar kilitlenme olabilir SQL okur biraz hayal kırıklığına uğradım sanırım. /Kilitlenmeleri büyük bir sorun olmaktan yazın görüyordum amaokur?Burada bankacılık sitesi yapmıyoruz, mükemmel doğruluk her zaman ihtiyacımız yok.

Fikirler? Düşünceler?


Yeni bir SERİ her işlem için DataContext nesnesinin SQL başlatmasını misin ya da belki de tüm aramalar için aynı statik içerik paylaşımı?

Jeremy, çoğunlukla temel Denetleyici bir statik datacontext paylaşıyoruz:

private DBContext _db;
/// <summary>
/// Gets the DataContext to be used by a Request's controllers.
/// </summary>
public DBContext DB
{
    get
    {
        if (_db == null)
        {
            _db = new DBContext() { SessionName = GetType().Name };
            //_db.ExecuteCommand("SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED");
        }
        return _db;
    }
}

Sayfa başına her Denetleyici için, ya da yeni bir içerik oluşturmak öneririz, ya da daha sık..?

CEVAP
21 AĞUSTOS 2008, PERŞEMBE


Senior:

http://msdn.microsoft.com/en-us/library/ms191242.aspx

Ne zaman ya Veya OKUMA KAYDEDİLMİŞ ANLIK görüntü ANLIK görüntü YALITIM İZİN veritabanı seçenekleri, mantıksal kopyaları (sürüm) tüm veriler korunur değişiklikler yapıldı veritabanı. Her seferinde bir satır değiştirilir özel bir işlem ile, Veritabanını örnek Motor mağazaları önceden kaydedilmiş bir sürümünü tempdb satır görüntü. Her sürüm işlem ile işaretlenmiş işlem sıra numarası bu değişikliği yaptı. Sürümleri değiştirilen satırlar zincirleme bir bağlantı kullanıyor liste. Yeni satır değerdir her zaman geçerli veritabanı ve saklı içinde zincirleme sürüm bilgisi satır saklanan tempdb.

Kısa süreli hareketler için, bir değiştirilen satır sürüm alabilirsiniz arabellek havuzu olmadan önbelleğe başlarken disk dosyalarına yazılmış tempdb veritabanı. İhtiyaç olursa sürüm bilgisi satır kısa ömürlü, sadece düştü alacak havuz ve ille Mayıs tampon G/Ç ek yük tabi.

Ekstra yükü için hafif bir başarım var gibi gözüküyor, ama önemsiz de olabilir. Test emin olmamız gerekir.

Gerçekten gerekmedikçe bu seçeneği deneyin ve KALDIRMA kodu sorgulardan tüm NOLOCKs. Veritabanı hareket izolasyon düzeyleri ile mücadele için NOLOCKs veya veritabanı içeriği işleyicisi genel yöntemler kullanarak sorunu için-Aıds Grubu. NOLOCKS veri katmanı ile temel sorunları Maskesi ve muhtemelen otomatik en iyi çözüm gibi görünüyor güvenilmez verilerin seçilmesi, yol açacaktır.

ALTER Database [StackOverflow.Beta] SET READ_COMMITTED_SNAPSHOT ON

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • Boiler Room

    Boiler Room

    10 Mayıs 2012
  • Droid Life

    Droid Life

    17 Kasım 2009
  • LiquidMusick

    LiquidMusick

    23 Aralık 2010