sql >> Base de Datos >  >> RDS >> Mysql

MySQL Select... para la actualización con el índice tiene un problema de concurrencia

Desde un punto de vista puramente teórico, parece que no está bloqueando las filas correctas (condición diferente en la primera declaración que en la declaración de actualización; además, solo bloquea una fila debido a LIMIT 1 , mientras que posiblemente actualice más filas más adelante).

Prueba esto:

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;

[editar]

En cuanto al motivo de su interbloqueo, esta es la respuesta probable (del manual ):

Sin un índice, el SELECT ... FOR UPDATE Es probable que la declaración bloquee toda la tabla, mientras que con un índice, solo bloquea algunas filas. Debido a que no bloqueó las filas correctas en la primera declaración, se adquiere un bloqueo adicional durante la segunda declaración.

Obviamente, no puede ocurrir un interbloqueo si toda la tabla está bloqueada (es decir, sin un índice). Sin duda, puede ocurrir un interbloqueo en la segunda configuración.