SQLinfo.ru - Все о MySQL

Форум пользователей MySQL

Задавайте вопросы, мы ответим

Вы не зашли.

#1 11.12.2009 23:20:17

Vladislavik
Участник
Зарегистрирован: 11.12.2009
Сообщений: 4

Параллельные потоки.

<?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)

Неактивен

 

#2 14.12.2009 14:21:14

paulus
Администратор
MySQL Authorized Developer and DBA
Зарегистрирован: 22.01.2007
Сообщений: 6757

Re: Параллельные потоки.

Ну, во-первых, если явно блокируете таблицы, то FOR UPDATE уже не нужен.
Во-вторых, Ваш код никак не мешает тому, чтобы два пользователя выполнили
его последовательно друг за другом. Пусть у Вас два пользователя пришли
одновременно. Один из них смог заблокировать табличку, а второй остался
ждать. Первый сделал полезную работу, разблокировал, и второй тут же начал
делать ее. Работа выполняется не параллельно, а последовательно.

Неактивен

 

Board footer

Работает на PunBB
© Copyright 2002–2008 Rickard Andersson