İŞLEM İZOLASYON SEVİYE SNAPSHOT vs TRUNCATE?


10

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?


Bunun yerine DELETE FROM foo kullanabilir misiniz? Bu şema kilidini yerleştirmez.
SqlACID

BUNU SİL gerçekten bu şekilde çalışıyorum. Ben de neden hata alıyorum ilgileniyorum (ve sadece Yordam1 döndükten sonra).
Mark Freeman

Yanıtlar:


19

Listesi 'DDL'listelenen operasyonlar kapsamlı değildir (ve TRUNCATE TABLEbu listeden sadece ihmal değil). İster TRUNCATE TABLEolduğunu DMLveya DDLtartışmanın her iki tarafta ikna edici örneklerle, SQL Server bir dolu soru ve Kitaplar Online'da iki yönde girdileri.

Bir anlık görüntü yalıtım işleminin bakış açısından, kesiğinin temel kalitesine sahip bir alan Sch-Mkilit engellemeyi açıklar (çünkü RCSIve SIhala elde Sch-Skilitler ); ayrıca dahili meta veri sürümünü (dahili nedenlerden dolayı *) daraltarak 3961 hatasına neden olur.

Yani, gördüğünüz davranış beklenmektedir, çok iyi belgelenmemiştir.

* Geçerli TRUNCATE TABLE uygulaması satır sürümleri oluşturmaz. Meta veri sürümünü çarpmak, doğru davranışı sağlamanın en basit yoludur.

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.