| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > Perl: разработка для Web > perl очередь запросов mysql |
| Автор: burakov 19.6.2013, 11:26 |
| Добрый день. назрела задача. есть куча скриптов одинаковых (граберы). которые должны с разных машин работать с одной базой. и тут встала проблема очереди. когда грабер (парсер) забирает задание из таблицы заданий. он ставит признак "в обработке". и обращение других скриптов -клонов уже это задание не затрагивает. но как оказалось этого мало. возникает все таки момент одновременно обращения. к таблице и некоторые задания забираются 2 и более раз. то есть это происходит, когда скрипты клоны одновременно обращаются к таблице заданий. товарищи подсказали решение через блокирование таблиц mysql LOCK TABLES `tbl` WRITE; INSERT INTO `tbl` VALUES ...вставляем, изменяем UNLOCK TABLES; как то оно мне "не очень" :(. что будет если одновременно клоны lock делать будут. и к тому же проверку на LOCK не LOCK преложили делать через SHOW OPEN TABLES чувствую что то здесь не так.! Ранее в многопоточных скриптах, применял решение, когда один поток работает с базой. и раздает все задания через use Thread::Queue; отлично работало. но теперь как бы конфигурация другая. куча однопоточных скриптов. на разных машинах должны работать с одной базой, расположенной на сервере. как в этом случае все грамотно сделать? и попроще Спасибо. |
| Автор: Jimy 19.6.2013, 14:56 |
| http://dev.mysql.com/doc/refman/5.0/en/innodb-locking-reads.html |
| Автор: burakov 19.6.2013, 16:14 |
| интересует просто личный опыт. того. а что будет если одновременно пойдет два таких блокирующих селекта? Mysql сам разрулит все?. то есть к примеру запрашиваю SELECT ... FOR UPDATE limit 4 всех остальных клонов-скриптов в этот момент эти 4 записи не существует? это на уровне mysql разруливается? |
| Автор: Jimy 19.6.2013, 16:41 |
| Личного опыта не имею, т.к. тоже всегда делал чтобы один поток работал с базой. Да, внутри MySQL все должно разрулиться Но эти блокировки работают только с таблицами InnoDB (в доке об этом написано, но на всякий случай уточняю). Думаю это самое грамотное решение. |
| Автор: tishaishii 27.6.2013, 22:15 |
| Думаю, лучше всего, не дублировать работу выбранных средств разработки с помощью других, менее приспособленных. По-другому, пускай каждый делает свою работу. Если средство разработки выполняет работу некачественно, то не стоит делать не него ставку и закладывать мину в проект, а выбрать лучший вариант. |
| Автор: burakov 27.6.2013, 22:39 |
| можете рассказать? как нужно делать? каким образом и чем организовать эту очередь.? спасибо. |
| Автор: tishaishii 29.7.2013, 16:45 |
| Распределять задачи по идентификаторам клиентов. Например, создать процедуру, которая бы по запросу возвращала задание, предварительно установив метку "в обработке". И клиенты могут по мере выполнения задания отправлять в центр информацию о статусе. |
| Автор: dimamaster 16.8.2013, 12:19 |
| Спасибо за консультацию. На северо-западе Москвы находится http://moskva-severozapad.ru/stroginskiy-bulvar-zhivopisnoe-mesto/ , который находится в районе Строгино. |