Snapshot di livello di isolamento delle transazioni vs. troncato?
-
02-11-2019 - |
Domanda
Spero che qualcuno possa far luce su questo comportamento che non mi aspettavo per quanto riguarda l'isolamento dell'istantanea rispetto al troncato.
Database: consentire Snapshot Isolation = true; È letto istantanea impegnato su = false.
Procedura1 (sostituisce il contenuto della tabella foo da un complesso di lunga durata selezionare con molti join):
BEGIN TRAN;
TRUNCATE TABLE foo;
INSERT INTO foo SELECT...;
COMMIT;
Procedura2 (recita dalla tabella foo):
SET TRANSACTION ISOLATION LEVEL SNAPSHOT;
SELECT * FROM foo;
Se la procedura1 è in esecuzione durante l'esecuzione della procedura2, la procedura2 viene sostenuta con un LCK_M_SCH_S wait (secondo SP_Whoisactive) fino alla fine della procedura1. E quando la procedura2 completa, aumenta questa eccezione:
La transazione di isolamento snapshot non è riuscita nel database 'databasename' perché l'oggetto accessibile dall'istruzione è stato modificato da un'istruzione DDL in un'altra transazione simultanea dall'inizio di questa transazione. Non è consentito perché i metadati non sono versione. Un aggiornamento simultaneo ai metadati può portare a incoerenza se miscelato con l'isolamento dell'istantanea.
Tuttavia, Microsoft non elenca il troncato come istruzione DDL non consentita nell'isolamento dell'istantanea: http://msdn.microsoft.com/en-us/library/bb933783.aspx
Chiaramente non capisco qualcosa correttamente, poiché mi sarei aspettato un miglior caso di procedura2 che restituisce immediatamente i dati impegnati più recentemente dalla tabella prima del troncato o un caso peggiore di essere trattenuto dalla procedura1 e quindi restituire il nuovo contenuto del tavolo. Puoi aiutare?
Nessuna soluzione corretta