2011-05-02 2 views
3

Si je le bloc SQL suivante (dans SQL Server 2008 R2):Une instruction SQL "DELETE" suivie d'une instruction "WHERE NOT IN" peut-elle être dans la même transaction?

BEGIN 
    BEGIN TRAN 

    DELETE FROM dbo.fooData 
    WHERE LastUpdate < DateAdd(hour, -1,GETUTCDATE()) 

    COMMIT 

    BEGIN TRAN 

    DELETE FROM dbo.barData 
    WHERE SessionID NOT IN (SELECT sub.SessionId FROM dbo.fooData sub) 

    COMMIT 
    RETURN 0 
END 

Je suppose que je dois faire une COMMIT explicite entre les déclarations pour que les données supprimées de fooData à afficher en la deuxième suppression. Est-ce correct? Idéalement, je voudrais que tout cela soit en une seule transaction. Exemple:

BEGIN 
    BEGIN TRAN 

    DELETE FROM dbo.fooData 
    WHERE LastUpdate < DateAdd(hour, -1,GETUTCDATE()) 

    DELETE FROM dbo.barData 
    WHERE SessionID NOT IN (SELECT sub.SessionId FROM dbo.fooData sub) 

    COMMIT 
    RETURN 0 
END 

Ma deuxième crainte est que la deuxième instruction ne récupère pas les données supprimées en premier. Notez que le retour est là car cela fait partie d'une procédure stockée. Je ne suis pas intéressé par les suppressions en cascade ou l'adhésion, je suis quelque peu contraint à cette méthode.

Répondre

3

La même transaction/session peut voir qu'il est propre changements. D'autres séances ne verront pas ces transactions non engagées cette séance

donc votre formulaire 2 (une transaction plus large) est sûr à utiliser.

+0

Merci pour la réponse rapide, agréable d'avoir à valider sur une intuition. Testera bientôt. – Brian

2

Vous pouvez utiliser le deuxième exemple. Parce que vous êtes dans la même transaction, vous accédez aux informations des opérations précédentes.

L'isolation indique que mais vous êtes dans la même transaction, afin que la transaction puisse accéder au résultat de la première opération.

+0

Merci pour l'explication en profondeur – Brian

Questions connexes