Je suis confus quant à la raison pour laquelle vous spécifieriez Edit: Désolé, j'ai mal posé la question mal. Je sais que les docs disent que cela transforme les choses en une "lecture de verrouillage" - ce que j'aimerais savoir, c'est "Quels cas existent là où le comportement observable diffère entre spécifier pour la mise à jour code> - Pourquoi la base de données se soucie-t-elle de ce que vous allez faire avec les données du Sélectionnez CODE>? p>
pour mettre à jour code> et ne pas la spécifier - C'est-à-dire que ce qui correspond spécifiquement à cette serrure implique? P>
5 Réponses :
Sélectionner pour la mise à jour indique aux RDBMS que vous souhaitez verrouiller ces lignes afin que personne d'autre ne puisse y accéder avant de mettre à jour et de les commenter ou de les rouler et de les déverrouiller: P>
http://www.techonthenet.com/oracle/cursors/for_update.php < / a> p>
Hein? Que doivent faire les curseurs avec cela?
Il crée une lecture de verrouillage afin que personne ne puisse la mettre à jour jusqu'à ce que vous n'ayez terminé, exemple voir ici http://dev.mysql.com/doc/refman/5.0/fr/innodb-locking-reads.html << / p> p>
Hein? La déclaration est terminée au point-virgule! (Qu'est-ce qui pourrait aller entre "pour la mise à jour" et le point-virgule?)
Quand cela se fait courir Man !. La déclaration est terminée au point-virgule
Je ne comprends pas - la déclaration est terminée au point-virgule Oui - ce qui signifie que dans votre exemple ci-dessus pour la mise à jour code> n'affecte pas la déclaration code> mise à jour code> - parce qu'ils «Réparez des déclarations séparées par des points-virgules (d'où ma confusion quant à la raison pour laquelle la directive devrait exister).
Lorsque les deux déclarations sont finies, vous avez terminé ...maybe qui le rend plus clair
Comment les RDBM savent-ils quand c'est cependant? Quand la connexion est fermée?
Lorsque la transaction se termine. c'est à dire. S'ENGAGER. Si vous avez des commissions auto-engagées et connexez des déclarations simples, cela n'a pas de sens.
Il va verrouiller les lignes (ou la table entière) afin que les lignes ne puissent pas être mises à jour dans une autre session simultanément. Le verrou est maintenu jusqu'à ce que les transactions soient validées ou roulées. P>
http://dev.mysql.com/doc/refman/5.0 /en/innodb-locking-reads.html
Il s'agit de verrouiller la table dans les transactions. Disons que vous avez ce qui suit: p> Une fois que l'instruction SELECT s'exécute, si vous avez une autre sélection d'un autre utilisateur, il ne fonctionnera pas avant que votre première transaction frappe le commit ligne. p> Notez également que pour la mise à jour code> en dehors d'une transaction n'a pas de sens. p> p>
Oui - J'ai lu les docs - mais qu'est-ce que cela fait pour l'utilisateur des SGBDM?
Ah - donc cela vous permettrait de faire quelque chose comme Démarrer la transaction; Sélectionnez Max (ID + 1) comme NewID à partir de la mise à jour; Insérer dans les valeurs tirées (ID) (NewID); Commettre; code> - et vous sauriez la valeur renvoyée pour max () + 1 code> ne pouvait pas entrer en conflit avec quelqu'un d'autre?
Le cas spécifique que celui-ci est conçu pour corriger est lorsque vous devez lire et mettre à jour une valeur dans une colonne. Parfois, vous pouvez vous en sortir avec la mise à jour de la colonne d'abord (qui le verrouille), puis la lisez ensuite, par exemple: Cela retournera la nouvelle valeur de compteur_field, mais cela peut être acceptable dans ton application. Il ne serait pas acceptable si vous essayiez de réinitialiser le champ (et vous avez donc besoin de la valeur d'origine) ou si vous avez eu un calcul complexe qui ne pouvait pas être exprimé dans une déclaration de mise à jour. Dans ce cas, pour éviter deux raccords de course pour mettre à jour la même colonne en même temps, vous devez verrouiller la ligne. P> Si votre RDBMS ne prend pas en charge la mise à jour, vous pouvez le simuler en effectuant une mise à jour inutile. par exemple p>