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?
- parser+mysql: получение уникальных id через auto_increment, nolar 27.10.2002 13:15