Veuillez considérer ces instructions SQL Les deux états ci-dessous font la même chose. Pourquoi? P> update abc
set B =0,
A = B
where A=1
4 Réponses :
Non. Les relevés de mise à jour unique sont atomiques et il n'y a pas d'ordre dans leurs parties individuelles.
Tous deux: P>
read in oldrow copy oldrow to newrow newrow.A = oldrow.B newrow.B = oldrow.A write out newrow
Est-ce que je lis et écrit les deux arrive en même temps? Cela ne crée-t-il aucune concurrence dans la fonctionnalité SQL Server?
SQL n'évalue pas les valeurs par ordre de champ. Les déclarations sont identiques en ce qui concerne SQL. P>
La mise à jour se produit en une étape (atomique), pas plusieurs commandées. P>
Que se passe-t-il est que SQL accède à chaque ligne de la table, puis met à jour Si cela vous aide à comprendre, vous pouvez y penser comme ce qui se passe dans un déclencheur de mise à jour, qui a accès à la valeur actuelle de la table dans la table code> supprimée code> et aux nouvelles valeurs de La table code> insérée code> la table logique. p> a code> à la valeur actuelle em> de B code> et la même heure em> mises à jour b code> 0. p>
Est-ce que je lis et écrit les deux arrive en même temps? Cela ne crée-t-il aucune concurrence dans la fonctionnalité SQL Server?
Si vous observez la déclaration, je lis en réalité la valeur de B code> et le réglez sur A code>.
@ Ismail - Vous faites une mise à jour Single i>. SQL Server garantit que la seule mise à jour i> sera atomique.
D'accord. Mais vous ne pensez-vous pas que b code> est en cours de lecture et défini sur A code>?
@ Iismail - c'est une mise en œuvre interne i> de détail dans SQL. L'important est que l'opération soit atomique. Comment i> SQL est une question différente.
Maintenant, je comprends que, il existe deux tables logiques I.e La valeur étant donc définie sur supprimé code> et inséré code> qui entrent dans l'image lorsque nous exécutons une déclaration de mise à jour. p>
A code> est extraite à partir de la colonne B code> de supprimé code> table et la valeur de B code> qui est défini sur 0 est celui dans la table code> insérée code>. p>
Variation sur la réponse de @ Iismail: Logiquement, une mise à jour est une suppression et un insert qui sont commis ensemble, c'est pourquoi vous obtenez une ligne dans chacune des tables logiques Un aide utile-Moiire est que p> transposera les valeurs des colonnes " p> p> supprimées code> et Inséré code> respectivement. L'unité de travail ici est la ligne: quand une ligne est mise à jour, elle est supprimée et réinsérée à l'aide des nouvelles valeurs (si vous souhaitez savoir quel les valeurs em> changent effectivement que vous devez le faire fonctionner vous-même. ).