J'espère que quelqu'un pourra faire la lumière sur ce comportement auquel je ne m'attendais pas en ce qui concerne l'isolement SNAPSHOT vs TRUNCATE.
Base de données: Autoriser l'isolement de l'instantané = True; Est-ce que l'instantané validé est lu = faux.
Procedure1 (remplace le contenu de la table foo d'un SELECT complexe de longue durée par de nombreuses jointures):
BEGIN TRAN;
TRUNCATE TABLE foo;
INSERT INTO foo SELECT...;
COMMIT;
Procedure2 (lit à partir de la table foo):
SET TRANSACTION ISOLATION LEVEL SNAPSHOT;
SELECT * FROM foo;
Si Procedure1 est en cours d'exécution pendant l'exécution de Procedure2, Procedure2 est retardé avec une attente LCK_M_SCH_S (selon sp_WhoIsActive) jusqu'à la fin de Procedure1. Et lorsque Procedure2 se termine, il déclenche cette exception:
La transaction d'isolement d'instantané a échoué dans la base de données 'DatabaseName' car l'objet auquel accède l'instruction a été modifié par une instruction DDL dans une autre transaction simultanée depuis le début de cette transaction. Il n'est pas autorisé car les métadonnées ne sont pas versionnées. Une mise à jour simultanée des métadonnées peut entraîner une incohérence si elle est mélangée à l'isolement de l'instantané.
Cependant, Microsoft ne répertorie pas TRUNCATE en tant qu'instruction DDL non autorisée sous l'isolement SNAPSHOT: http://msdn.microsoft.com/en-us/library/bb933783.aspx
De toute évidence, je ne comprends pas quelque chose correctement, car je m'attendais à un meilleur cas de Procedure2 renvoyant immédiatement les données les plus récemment validées de la table avant le TRUNCATE ou au pire des cas de blocage par Procedure1, puis de retour du nouveau contenu du table. Pouvez-vous m'aider?