Задавайте вопросы, мы ответим
Вы не зашли.
<?php
$time=time();
mysql_query("LOCK TABLES `base` WRITE;");
$sql=mysql_query("SELECT `timestamp` FROM `base` WHERE `id`='1' FOR UPDATE");
$stime=mysql_fetch_array($sql);
if($stime['timestamp']>=$time)
{}else
{
if($stime['timestamp']+30>=$time)
{}else
{
mysql_query("UPDATE `base` SET `timestamp`='".$time." WHERE `id`='1'");
//Полезная работа;
}
}
mysql_query("UNLOCK TABLES");
?>
Имеется таблица MyIsam.
Иногда случается ситуация, при которой практически одновременно 2 или более юзеров запускают скрипт и запрашивают timestamp, и происходит UPDATE timestamp'а и, соответственно, несколько раз выполняется "полезная работа".
Как избежать такой ситуации? Испробовал, как видно все и транзакции, и FOR UPDATE, и проверку на то, что timestamp больше time(). Все равно иногда timestamp выполняется 2 а то и три раза.
Отредактированно Vladislavik (11.12.2009 23:56:44)
Неактивен
Ну, во-первых, если явно блокируете таблицы, то FOR UPDATE уже не нужен.
Во-вторых, Ваш код никак не мешает тому, чтобы два пользователя выполнили
его последовательно друг за другом. Пусть у Вас два пользователя пришли
одновременно. Один из них смог заблокировать табличку, а второй остался
ждать. Первый сделал полезную работу, разблокировал, и второй тут же начал
делать ее. Работа выполняется не параллельно, а последовательно.
Неактивен