Mysql
 sql >> Base de données >  >> RDS >> Mysql

MySQL Select... pour la mise à jour avec l'index a un problème de concurrence

D'un point de vue purement théorique, il semble que vous ne verrouillez pas les bonnes lignes (condition différente dans la première instruction que dans l'instruction de mise à jour ; de plus, vous ne verrouillez qu'une seule ligne à cause de LIMIT 1 , alors que vous mettrez peut-être à jour plus de lignes plus tard).

Essayez ceci :

START TRANSACTION;
SELECT v_id FROM v_ext WHERE username IS NULL AND v_id=yyy FOR UPDATE;
UPDATE v_ext SET username=xxx WHERE v_id=yyy;
COMMIT;

[modifier]

Quant à la raison de votre blocage, c'est la réponse probable (du manuel ):

Sans index, le SELECT ... FOR UPDATE est susceptible de verrouiller la table entière, alors qu'avec un index, elle ne verrouille que certaines lignes. Comme vous n'avez pas verrouillé les bonnes lignes dans la première instruction, un verrou supplémentaire est acquis lors de la deuxième instruction.

De toute évidence, un blocage ne peut pas se produire si toute la table est verrouillée (c'est-à-dire sans index). Un blocage peut certainement se produire dans la deuxième configuration.