que hacer esto para asegurarse una sola vez instancia de este proceso está en ejecución (pseudo código php/InnoDB MySQL):MySQL InnoDB bloqueo muerto en SELECT con bloqueo exclusivo (FOR UPDATE)
START TRANSACTION
$rpid = SELECT `value` FROM locks WHERE name = "lock_name" FOR UPDATE
$pid = posix_getpid();
if($rpid > 0){
$isRunning = posix_kill($rpid, 0);
if(!$isRunning){ // isRunning
INSERT INTO locks values('lock_name', $pid) ON DUPLICATE KEY UPDATE `value` = VALUES(`value`)
}else{
ROLLBACK
echo "Allready running...\n";
exit();
}
}else{ // if rpid == 0 -
INSERT INTO locks values('lock_name', $pid) ON DUPLICATE KEY UPDATE `value` = VALUES(`value`)
}
COMMIT
...............
//free the pid
INSERT INTO locks values('lock_name', 0) ON DUPLICATE KEY UPDATE `value` = VALUES(`value`)
bloqueos de tabla contienen estos campos :
id - primary, autoinc
name - varchar(64) unique key
description - text
value - text
creo que el tiempo desde el inicio TRANSACTIN a COMMIT/ROLLBACK es realmente milisegundos - no hay tiempo suficiente para conseguir incluso tiempo de espera. ¿Cómo es posible tener un punto muerto con este código? No uso otras tablas dentro de esta transacción. Parece que el punto muerto no es posible. Si 2 procesos comienzan al mismo tiempo, el primero que obtiene el bloqueo en esa fila procederá y el otro esperará a que se libere el bloqueo. Si el bloqueo no se libera en 1 minuto, el error es "tiempo de espera", no interbloqueo.
Así que si uso ACTUALIZACIÓN en lugar de INSERT, clave primaria no le hará daño. Además, el problema no está en una mesa. Hay otras tablas que no puedo eliminar la clave principal. ¿Hay alguna otra solución? Debería haber una forma de guardar insertando una fila cuando hace X bloquear en una fila – NickSoft
Supongo que lo difícil es tener bloqueos de tabla con solo un índice único y usarlo para bloquear antes del bloqueo X e insertarlo en tablas más complejas. Pero eso tiene que hacerse antes de cada inserción que pueda estancar y espero que haya otra forma. Entonces, ¿hay alguna otra forma de insertar de forma segura en tablas con más de un índice (único?). – NickSoft