--------------
Если вы используете таблицы, не поддерживающие транзакций, то при использовании программы обработки таблиц необходимо применять команду LOCK TABLES для гарантии, что никакой другой поток не вклинился между операциями SELECT и UPDATE. Ниже показан пример, требующий использования LOCK TABLES для успешного выполнения операций:
mysql> LOCK TABLES trans READ, customer WRITE;
mysql> SELECT SUM(value) FROM trans WHERE customer_id=some_id;
mysql> UPDATE customer SET total_value=sum_from_previous_statement
WHERE customer_id=some_id;
mysql> UNLOCK TABLES;
--------------
Отличие в том, что мне надо сделать UPDATE той таблицы, для которой сделан SELECT. Пробую так:
mysql> LOCK TABLES tbl READ
mysql> SELECT * FROM tbl WHERE id=1;
далее в php обрабатываю данные селект запроса, затем
mysql>UPDATE tbl SET flag=1 WHERE id=1;
mysql> UNLOCK TABLES;
Вылазит ошибка при UPDATE. Непонятны моменты:
1)Заблокировано для чтения (READ), так почему же ошибка при записи? Видимо, я так и не понял, что делает эта команда и что значит READ.
2)Возможно ли сделать так чтобы во время блокировки таблицы остальные запросы становились в очередь (для того, чтобы php скрипт работал корректно, даже если таблица заблокирована)?
Помогите пожалуйста разобраться! Огромное спасибо!
Спустя 15 минут, 39 секунд (19.03.2010 - 01:35) waldicom написал(а):
А на InnoDB никак нельзя перейти для поддержки транзакций (я так полагаю, сейчас таблицы в MyISAM? )
Спустя 11 минут, 33 секунды (19.03.2010 - 01:46) Guest написал(а):
Цитата (waldicom @ 18.03.2010 - 22:35) |
А на InnoDB никак нельзя перейти для поддержки транзакций (я так полагаю, сейчас таблицы в MyISAM? ) |
Да, MyISAM. Честно говоря, я не очень разбираюсь в типах таблиц. А как подобное может выглядеть в InnoDB?
Спустя 2 часа, 27 минут, 53 секунды (19.03.2010 - 04:14) kirik написал(а):
Цитата (Dale @ 18.03.2010 - 17:19) |
ничего не вклинилось |
Ничего это что? Чтобы никто не смог прочитать эту таблицу или записать в нее?
Спустя 1 час, 7 минут, 51 секунда (19.03.2010 - 05:22) Dale написал(а):
Вообще, если подробно, то задача такая:
Есть php скрипт, к которому производится большое количество запросов.
В таблице кроме флажка хранится время, в которое должен поменяться флажок и ОДИН раз должна выполнится часть скрипта. Выглядит примерно так:
Ну так вот, часть кода, которая должна выполняться строго 1 раз, иногда выполняется дважды (насколько я понял - это следствие частых одновременных обращений к этому скрипту, в результате чего флаг не всегда успевает зажечься, и запросы к mySql попадают в маленький промежуток между select и update).
Мне порекомендовали использовать LOCK TABLES.
Есть php скрипт, к которому производится большое количество запросов.
В таблице кроме флажка хранится время, в которое должен поменяться флажок и ОДИН раз должна выполнится часть скрипта. Выглядит примерно так:
<?php
//....
$q=mysql_query("[sql]SELECT * FROM tbl WHERE id=1[/sql]") or die("error");
$result=mysql_fetch_array($q,MYSQL_ASSOC);
if($result["a"]==0 && $result["time"]>=time() )
{
mysql_query("[sql]UPDATE tbl SET a=1 WHERE id=1[/sql]");
//.................
//это должно произойти 1 раз
//...............
}
//.......
?>
Ну так вот, часть кода, которая должна выполняться строго 1 раз, иногда выполняется дважды (насколько я понял - это следствие частых одновременных обращений к этому скрипту, в результате чего флаг не всегда успевает зажечься, и запросы к mySql попадают в маленький промежуток между select и update).
Мне порекомендовали использовать LOCK TABLES.
Спустя 2 часа, 50 минут, 21 секунда (19.03.2010 - 08:12) kirik написал(а):
Ясно. Можно использовать GET_LOCK() и RELEASE_LOCK() чтобы не блочить таблицу целиком.