[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: Очередность запросов в Highload проектах
greatilya
Добрый день!

Подскажите, как правильно блокировать таблицы в MySQL при одновременном доступе к таблице несколькими скриптами. Допустим имеется в таблице счетчик, нам надо получить его текущее значение и увеличить на 1.

$oDb->query('LOCK TABLES `table` WRITE');
$counter=$oDb->selectCell('SELECT `counter` FROM `table` WHERE `id`=555');
$counter++;
$oDb->query('UPDATE `table` SET `counter`=?d WHERE `id` = 555', $counter);
$oDb->query('UNLOCK TABLES');


Правильно ли я написал? Другие скрипты не смогут же вклиниться и считать значение counter пока я его не увеличу?



Спустя 41 минута, 23 секунды (17.03.2012 - 07:13) Visman написал(а):
А зачем блокировать?
Делаем
$counter=$oDb->selectCell('SELECT `counter` FROM `table` WHERE `id`=555');
$oDb->query('UPDATE `table` SET `counter`=`counter`+1 WHERE `id` = 555');

если конечно счетчик нужен, иначе только второй запрос.

Спустя 8 минут, 7 секунд (17.03.2012 - 07:21) greatilya написал(а):
Цитата
А зачем блокировать?


Представим что у нас 2 одновременных скрипта совпали по времени к обращению к таблице (хотя в высоконагруженных проектах их может быть куда больше). Тогда мы получим следующаю последовательность запросов:

$counter=$oDb->selectCell('SELECT `counter` FROM `table` WHERE `id`=555'); //скрипт 1
$counter=$oDb->selectCell('SELECT `counter` FROM `table` WHERE `id`=555'); //скрипт 2
$oDb->query('UPDATE `table` SET `counter`=`counter`+1 WHERE `id` = 555'); //скрипт 1
$oDb->query('UPDATE `table` SET `counter`=`counter`+1 WHERE `id` = 555'); //скрипт 2


Итого, оба скрипта получат одно и то же значение счетчика. А если этот счетчик несет в себе некий смысл, тогда такого нельзя допускать. Так что блокировать точно нужно... вот только правильно ли я делаю?

Спустя 49 минут, 9 секунд (17.03.2012 - 08:10) EvilDev написал(а):
mysql> LOCK TABLES real_table WRITE, insert_table WRITE;
mysql> INSERT INTO real_table SELECT * FROM insert_table;
mysql> TRUNCATE TABLE insert_table;
mysql> UNLOCK TABLES;

Спустя 1 час, 8 минут, 24 секунды (17.03.2012 - 09:18) greatilya написал(а):
EvilDev,
вопрос не в том, как добавить данные. А вопрос в том, как сделать чтобы между чтением и записью не допустить других запросов к таблице. И в первом сообщении я написал свой вариант, и хотел бы уточнить, правильно ли я написал (есть ли где-то недочеты).

Спустя 3 минуты, 49 секунд (17.03.2012 - 09:22) Visman написал(а):
greatilya, если работает, значит правильно!
Быстрый ответ:

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