DO La table est en Innodb et la requête est dans la transaction intérieure P> SELECT ... pour la mise à jour code> dans cette requête des lignes de verrouillage de la requête dans cette table?
select max(id) from table1 FOR UPDATE
5 Réponses :
Utilisez à la place Définit un verrou de mode partagé sur les rangées
lire. Un verrouillage de mode partagé permet à d'autres
sessions pour lire les rangées mais pas pour
modifier-les. Les rangées lues sont la
Dernière disponible, donc s'ils appartiennent à
une autre transaction qui n'a pas encore
engagé, les blocs de lecture jusqu'à ce que
la transaction se termine. p>
blockQuote>
voir dans le docs . < / p> Sélectionnez ... pour mettre à jour code> bloque d'autres sessions à partir de
Sélectionnez ... verrouillage en mode partage code> p>
Sélectionnez ... Verrouillage en mode de partage CODE> QUI P>
Peut-être cela fonctionnerait-il? :
select id from table where id IN (select max(id) from table1) FOR UPDATE
comme dans la documentation Oracle Cette clause est soumise aux restrictions suivantes: Vous ne pouvez pas spécifier cette clause avec les autres constructions suivantes: l'opérateur distinct, l'expression du curseur, les opérateurs de définir, le groupe_by__clause ou les fonctions d'agrégat. P>
Ceci est affiché si vous préparez un < Code> Sélectionnez ID à partir de table1 où id = (Sélectionnez max (ID) à partir de table1) pour la mise à jour CODE> - verrouille cette ligne forte> qui correspond à Ceci est à nouveau expliqué par un Sélectionnez max (ID) à partir de table1 pour la mise à jour CODE> - ne verrouille aucune ligne de lignes car elle ne change pas de lignes. Les informations requises sont extraites à partir de l'indice de table.
décrivez code> à la requête, affichant: p>
max (id) code> Parce que vous récupérez explicitement cette ligne. p>
Sélectionnez ID à partir de table1 Commande par ID DE LA LIMITE 1 POUR LA MISE À JOUR CODE> - Verrouillez-la toutes les lignes forte> et récupéreront
Max (id) code> à l'aide d'une combinaison de
commander par code> et
limite 1 code>. P>
Décrire code> requête. P> p>
Sûrement pour l'exactitude mySQL doit faire le verrouillage (lorsque ID code> est indexé probablement qu'il doit contenir un verrou sur cet enregistrement)
La documentation MySQL stipule que "Sélectionner des tables optimisées" signifie que "il n'est pas nécessaire de lire des tableaux lors de l'exécution de la requête", au moins pour 5,5, 5,6, 5.7: dev.mysql.com/doc/refman/5.5/fr/Explain-Output.html dev.mysql.com/doc/refman/5.6/fr/Explain-Output.html < / a> dev.mysql.com/doc/refman/5.7 /en/explain-Output.html
J'ai trébuché sur cela aussi et j'ai testé ce cas. thread 1: p> thread 2: P > thread 1: p> thread 2: p> Il apparaît InnoDB ne verrouille pas l'écart lorsque vous utilisez la fonction de groupe, verrouille simplement les enregistrements existants. Sans filetage de la fonction de groupe 2 renvoie 2 rangées, y compris une nouvelle, comme prévu. P> p>
Qu'est-ce qui vous fait penser que ça ne les verrouille pas?
Et quel est ce résultat? Peut-être que vous interprétez le problème