10
votes

Quel est le but de choisir ... * pour la mise à jour *?

Je suis confus quant à la raison pour laquelle vous spécifieriez pour la mise à jour - Pourquoi la base de données se soucie-t-elle de ce que vous allez faire avec les données du Sélectionnez ?

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 mettre à jour et ne pas la spécifier - C'est-à-dire que ce qui correspond spécifiquement à cette serrure implique?


0 commentaires

5 Réponses :


1
votes

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:

http://www.techonthenet.com/oracle/cursors/for_update.php < / a>


1 commentaires

Hein? Que doivent faire les curseurs avec cela?



0
votes

6 commentaires

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 n'affecte pas la déclaration mise à jour - 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.



0
votes

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.


0 commentaires

17
votes

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: xxx

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.

Notez également que pour la mise à jour en dehors d'une transaction n'a pas de sens.


2 commentaires

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; - et vous sauriez la valeur renvoyée pour max () + 1 ne pouvait pas entrer en conflit avec quelqu'un d'autre?



3
votes

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: xxx

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.

Si votre RDBMS ne prend pas en charge la mise à jour, vous pouvez le simuler en effectuant une mise à jour inutile. par exemple xxx


0 commentaires