Je suis très confus.Anomalie de mise à jour perdue dans la commande de mise à jour du serveur SQL Server
J'ai une transaction au niveau d'isolation ReadCommitted. Entre autres choses, je suis aussi mise à jour d'une contre-valeur en elle, quelque chose de similaire à ci-dessous:
Update tblCount set counter = counter + 1
Mon application est une application de bureau et cette transaction arrive à se produire assez fréquemment et en même temps. Nous avons récemment remarqué une erreur que parfois la valeur du compteur n'est pas mise à jour ou est manquée. Nous insérons également un enregistrement sur chaque mise à jour du compteur, nous sommes donc sûrs que les enregistrements ont été insérés mais que le compteur ne parvient pas à se mettre à jour. Cela arrive une fois en 2000 transactions simultanées. Je doute sérieusement qu'il s'agisse d'une anomalie de mise à jour perdue, mais si vous regardez la commande ci-dessus, il suffit de mettre à jour le compteur de sa propre valeur: si j'ai commencé une transaction et que la transaction a atteint cette déclaration, aurait dû verrouiller la ligne. Cela ne devrait pas causer de mise à jour perdue, mais cela arrive d'une manière ou d'une autre.
Est-ce que cette commande de mise à jour fonctionne en deux parties? Comme d'abord, il lit la valeur du compteur (au cours de laquelle il n'obtient pas le verrou exclusif), puis écrit la nouvelle valeur calculée (lorsqu'il reçoit un verrou exclusif)?
S'il vous plaît aider, j'ai vraiment confus.
Exécutez-vous ceci dans une transaction elle-même? Il ne va pas verrouiller quoi que ce soit s'il n'est pas dans une transaction malgré les données que vous attendez qu'il lise. –
Aucune clause WHERE? 2000 transactions essayant toutes de mettre à jour la même ligne, cela ne va pas à l'échelle. –
Oui cela est dans la transaction .NET avec le niveau d'isolement ReadCommitted, et oui il a une clause where dans la requête comme ci-dessous, Mise à jour tblCount set counter = compteur + 1 où counterID = 10 – Javed