parser

Написать ответ на текущее сообщение

 

 
   команды управления поиском

parser+mysql: получение уникальных id через auto_increment

nolar 27.10.2002 13:15

Вот опять я со своим шаманством :-) На этот раз про базу данных.

Дано:
1) сервер mysql, база, таблица с ключом, формируемых через auto_increment (реальная структура не имеет значения);
2) клиент - парсер (два варинта: cgi и модульный);
3) программа (точнее, скрипт) на parser примерно со следующим алгоритмом:
3.1) добавить запись в таблицу (insert into таблица).
3.2) получить ключ записи (select last_insert_id()).
3.3) дальнейшее использование ключа в своих целях.

Проблема: при добавлении из нескольких потоков.

CGI версия: все нормально. Один запрос - одно соединение. Last_insert_id возвращает номер в рамках соединения. То есть почти последовательная работа. Проблем нет.

Модульная версия. Все запросы - одно соединение. Возмем два потока выполнения запросов: наблюдаемый и побочный. Наблюдаемый поток выполняет insert. Потом за счет параллельности побочный поток выпоолняет свой insert. Затем наблюдаемый поток получает last_insert_id, который, очевидно, уже неверен (он берется из последнего insert'а, то есть от побочного потока).

Примечание: использование get_lock/release_lock бесполезно. Они тоже работают в рамках одного соединения. Очередной get_lock автоматически освобождает все предыдещие локи текущего соединения. То есть ручные локи не помогут.

Вопрос: как обеспечить получение сгенерированного ключа для нужного insert-запроса в модульной версии parser'а при работе с mysql?