2011-07-06 4 views
1

Possible en double:
SELECT … FOR UPDATE and MAX()SELECT FOR UPDATE

Quelles sont les lignes de ce verrou de requête? Que se passe-t-il si un autre utilisateur exécute cette requête? Que se passe-t-il si un autre utilisateur exécute cette requête?

this est une question connexe.

+0

c'est ma question. Lire la dernière ligne de ma question – user677900

+0

Oui, je sais. Je l'ai trouvé à la dernière ligne de votre question. Et je pense toujours que vous ne devriez pas poser plusieurs questions qui demandent la même chose. –

Répondre

3

Si vous n'avez pas d'index sur l'ID, cela verrouillera tous les enregistrements. Mais je suppose que vous avez un tel indice. Cela verrouillera tous les enregistrements correspondants, y compris certains enregistrements (si vous verrouillez 3 et 5, 4 est également verrouillé)

A SELECT ... FOR UPDATE lit les dernières données disponibles, paramètre verrous exclusifs sur chaque ligne, il lit. Ainsi, il définit les mêmes verrous qu'un SQL UPDATE recherché placerait sur les lignes.

modifier Dans le cas de SELECT max (id) FROM ... vous n'avez pas besoin de lire toutes les lignes de la table, parce que cette information peut être optained de l'indice. Si vous voulez verrouiller exactement une ligne, la requête correcte serait SELECT * FROM table WHERE id = SELECT max (id) FROM table

+0

donc un autre select max (id) pour la mise à jour de retour quoi? – user677900

+1

select max (id) a besoin de lire uniquement l'index, pas la ligne, il est donc possible que cela ne verrouille rien, et vous devez effectuer select * où id = select max (id) –

+0

il est possible que cela a gagné ' t verrouiller quoi que ce soit? sélectionnez max() pour mettre à jour les lignes de verrouillage? – user677900