[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: mySql (LOCK TABLES), вопрос новичка
Dale
Мой случай точно такой, как в найденном примере: мне нужно, чтобы между запросами SELECT и UPDATE 100% ничего не вклинилось:

--------------
Если вы используете таблицы, не поддерживающие транзакций, то при использовании программы обработки таблиц необходимо применять команду 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 скрипт, к которому производится большое количество запросов.

В таблице кроме флажка хранится время, в которое должен поменяться флажок и ОДИН раз должна выполнится часть скрипта. Выглядит примерно так:
<?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() чтобы не блочить таблицу целиком.
Быстрый ответ:

 Графические смайлики |  Показывать подпись
Здесь расположена полная версия этой страницы.
Invision Power Board © 2001-2025 Invision Power Services, Inc.