Spero che qualcuno possa far luce su questo comportamento che non mi aspettavo per quanto riguarda l'isolamento SNAPSHOT rispetto a TRUNCATE.
Database: consenti isolamento snapshot = True; È stato letto l'istantanea confermata attivata = Falso.
Procedura 1 (Sostituisce il contenuto della tabella foo da un complesso SELECT di lunga durata con molti join):
BEGIN TRAN;
TRUNCATE TABLE foo;
INSERT INTO foo SELECT...;
COMMIT;
Procedura2 (Legge dalla tabella foo):
SET TRANSACTION ISOLATION LEVEL SNAPSHOT;
SELECT * FROM foo;
Se la Procedura1 è in esecuzione mentre la Procedura2 viene eseguita, la Procedura2 viene trattenuta con un'attesa LCK_M_SCH_S (secondo sp_WhoIsActive) fino al completamento della Procedura1. E quando la procedura2 viene completata, genera questa eccezione:
Transazione di isolamento dello snapshot non riuscita nel database 'DatabaseName' perché l'oggetto a cui accede l'istruzione è stato modificato da un'istruzione DDL in un'altra transazione simultanea dall'inizio di questa transazione. Non è consentito perché i metadati non sono sottoposti a versione. Un aggiornamento simultaneo dei metadati può causare incoerenze se mescolato con l'isolamento dello snapshot.
Tuttavia, Microsoft non elenca TRUNCATE come un'istruzione DDL non consentita dall'isolamento SNAPSHOT: http://msdn.microsoft.com/en-us/library/bb933783.aspx
Chiaramente non sto capendo qualcosa correttamente, poiché mi sarei aspettato un caso migliore di Procedura2 che restituisse immediatamente i dati più recenti impegnati dalla tabella prima del TRUNCATE o un caso peggiore di essere trattenuto da Procedura1 e quindi restituendo il nuovo contenuto del tavolo. Puoi aiutare?