2017-07-19 2 views

Répondre

1

Non, il n'a pas, depuis la mise à jour nécessite un verrou exclusif sur l'enregistrement en cours mis à jour et InnoDB n'accordera plus de 1 verrou exclusif sur une enregistrer à la fois.

+0

Merci. Le problème est que j'ai lu que la mise à jour nécessite un verrou exclusif pour plusieurs endroits, y compris le manuel de référence, mais la plupart sont pour l'utilisation de FOR UPDATE. Je ne suis pas sûr qu'il y ait une différence entre UPDATE et FOR UPDATE dans ce contexte. –

+0

La clause de mise à jour est utilisée avec les sélections. La prochaine fois que les pls incluent ces points dans votre question, pas dans un commentaire ultérieur séparé. – Shadow

+0

aucune autre différence? –

1

(Pour répondre à certains commentaires)

Dans beaucoup (pas tous) des situations, c'est le modèle à suivre:

BEGIN; 
SELECT ... FOR UPDATE; 
use the data from the SELECT to make decisions, then 
UPDATE the row(s) selected 
COMMIT. 

Si vous omettez le FOR UPDATE, puis une autre connexion pourrait se faufiler dans et changez la rangée (s), seulement pour avoir votre UPDATE clobber ces changements. (Bien sûr, il y a des cas où cela est "OK".)

Quant à

UPDATE tbl SET is_locked = 1 WHERE id = 1 and is_locked = 0; 

il n'y a pas de problème. Cette déclaration, indépendamment de la façon dont vous l'exécutez, est "atomique". Aucune autre connexion ne peut se faufiler et vous embêter. (Cependant, il est logiquement idempotent, il est donc pas un problème.)

par "quel que soit", je me réfère à autocommit, BEGIN, tx_isolation_mode, etc.