Birisi SNAPSHOT izolasyon vs TRUNCATE ile ilgili beklemiyordum bu davranış biraz ışık tutabilir umuyorum.
Veritabanı: Anlık Görüntü Yalıtımına İzin Ver = Doğru; Okundu Taahhütlü Anlık Görüntü Açık = Yanlış.
Yordam1 (Uzun süredir devam eden bir SELECT kompleksinden tablo foo içeriğini çok sayıda birleştirmeyle değiştirir):
BEGIN TRAN;
TRUNCATE TABLE foo;
INSERT INTO foo SELECT...;
COMMIT;
Prosedür2 (Tablo foo'ndan okur):
SET TRANSACTION ISOLATION LEVEL SNAPSHOT;
SELECT * FROM foo;
Yordam2 yürütülürken Yordam1 çalışıyorsa, Yordam1 tamamlanana kadar Yordam2 bir LCK_M_SCH_S bekleme (sp_WhoIsActive'e göre) ile tutulur. Yordam2 tamamlandığında, bu istisnayı artırır:
İfade tarafından erişilen nesne, bu işlemin başlamasından bu yana başka bir eşzamanlı işlemde DDL ifadesi tarafından değiştirildiğinden, 'VeritabanıAdı' veritabanında anlık görüntü yalıtım işlemi başarısız oldu. Meta veriler sürümlendirilmediğinden izin verilmiyor. Meta veride eşzamanlı güncelleme, anlık görüntü yalıtımı ile karıştırıldığında tutarsızlığa neden olabilir.
Ancak, Microsoft TRUNCATE'i SNAPSHOT yalıtımı altında izin verilmeyen bir DDL ifadesi olarak listelemez: http://msdn.microsoft.com/en-us/library/bb933783.aspx
Açıkça doğru bir şey anlamadım, çünkü TRUNCATE öncesinde tablodan en son işlenen verileri derhal döndüren en iyi Prosedür2 vakası veya Prosedür1 tarafından tutulmakta olan en kötü durum ve daha sonra tablo. Yardım edebilir misin?