2013-04-16 7 views
0

J'ai besoin de mettre à jour quelques entrées avec des valeurs différentes et d'effectuer une requête par mise à jour.Isolation T-SQL lors de plusieurs mises à jour

Avant cela, je vérifie chaque valeur initiale pour m'assurer que l'entrée peut être mise à jour.

Je ne suis même pas sûr que cela puisse arriver mais j'aimerais éviter que ces entrées ne soient modifiées par une autre requête juste après avoir fait ma vérification.

Voici un exemple de ce que je veux éviter

1) query1 vérifie la valeur initiale

2) query2 vérifie la valeur initiale

3) query1 applique la mise à jour

4) query2 applique la mise à jour

J'ai entendu parler du niveau d'isolement, mais je n'ai pas compris comment l'utiliser pour éviter le problème, pourriez-vous m'aider ?

Merci d'avance pour votre aide

Répondre

0

Utilisez des transactions.

SET TRANSACTION ISOLATION LEVEL REPEATABLE READ; 
GO 
BEGIN TRANSACTION; 

--check stuff 

--update stuff 

COMMIT TRANSACTION; 

REPEATABLE READ fera en sorte que tout ce que vous lisez (choisir) restera le même jusqu'à ce que votre code atteint validation de la transaction. Personne ne peut apporter de modifications aux enregistrements que vous avez lus. Plus d'informations sur les transactions et le niveau d'isolement ici: SET TRANSACTION ISOLATION LEVEL

1

Je me demande pourquoi vous n'utilisez pas simplement UPDATE atomique pour faire vérifier dans la partie WHERE, puis mettre à jour pour cela?

Quoi qu'il en soit si vous devez utiliser Select et mise à jour: Je me réfère à vous très bon article: http://samsaffron.com/blog/archive/2007/04/04/14.aspx

opération est nécessaire pour éviter les lectures sales, etc. Mais une autre chose que vous devez faire attention est IMPASSE. En approche distribuée, si vous n'utilisez pas UPDLOCK (qui verrouillent les ressources pour d'autres mises à jour), vous pouvez mettre à jour différentes données que vous avez lues.

Questions connexes