Я делаю это, чтобы убедиться, что только один экземпляр этого процесса запущен (псевдокод php / mysql innodb):
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`)
Блокировки таблицы содержат следующие поля:
id - primary, autoinc
name - varchar(64) unique key
description - text
value - text
IПолагаю, что время от START TRANSACTIN до COMMIT / ROLLBACK действительно составляет миллисекунды - времени не хватает даже на то, чтобы получить тайм-аут.Как можно получить тупик с этим кодом?Я не использую другие таблицы в этой транзакции.Похоже, что тупик невозможен.Если одновременно запускаются 2 процесса, то первый, получивший блокировку в этом ряду, будет запущен, а другой будет ожидать снятия блокировки.Если блокировка не снята в течение 1 минуты, то ошибка «тайм-аут», а не тупик.