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

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a dba.stackexchange
scroll top