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

Selección de Mysql para actualización:no está bloqueando las filas de destino. ¿Cómo me aseguro de que lo haga?

A SELECT FOR UPDATE bloquea la fila que seleccionó para actualizar hasta que finalice la transacción que creó. Otras transacciones solo pueden leer esa fila, pero no pueden actualizarla mientras la transacción Seleccionar para actualizar aún esté abierta.

Para bloquear la(s) fila(s):

START TRANSACTION;
SELECT * FROM test WHERE id = 4 FOR UPDATE;
# Run whatever logic you want to do
COMMIT;

La transacción anterior estará activa y bloqueará la fila hasta que se confirme.

Para probarlo, hay diferentes maneras. Lo probé usando dos instancias de terminal con el cliente MySQL abierto en cada una.

En el first terminal ejecutas el SQL:

START TRANSACTION;
SELECT * FROM test WHERE id = 4 FOR UPDATE;
# Do not COMMIT to keep the transaction alive

En el second terminal puede intentar actualizar la fila:

UPDATE test SET parent = 100 WHERE id = 4;

Dado que crea una selección para actualizar en el first terminal la consulta anterior esperará hasta que se confirme la transacción seleccionada para actualizar o se agote el tiempo de espera.

Vuelve a la first terminal y confirme la transacción:

COMMIT;

Compruebe el second terminal y verá que se ejecutó la consulta de actualización (si no se agotó el tiempo de espera).