Что мне нужно сделать, если нужно, чтобы $mdb2->lastInsertID() возвращал значение автоинкремента для этого соединения?
Недавно я перешел с SQL Server на MySQL, и нигде не могу найти достаточно убедительного ответа на этот вопрос:
Я использую PHP, MySQL и механизм таблиц InnoDB для таблиц, которые нужно заблокировать. Итак, для стандартной серии из 3 утверждений:
- Вставить в таблицу А
- $id = $mdb2->lastInsertID()
- Вставьте в таблицу B (name, fk) VALUES ('foo', $id)
Какие шаги мне нужно предпринять, чтобы убедиться, что $ id имеет значение вставки из шага 1? Это так, как есть? Все ли должно быть в транзакции? Нужно ли добавлять другие запросы для блокировки и освобождения таблиц?
Спасибо, парни.
2 ответа
Вы должны / могли, но вам НЕ НУЖНО ничего делать: информационные функции, function_last-insert-id
Сгенерированный идентификатор сохраняется на сервере для каждого соединения. Это означает, что значение, возвращаемое функцией данному клиенту, является первым значением AUTO_INCREMENT, сгенерированным для самого последнего оператора, влияющего на столбец AUTO_INCREMENT этим клиентом. На это значение не могут повлиять другие клиенты, даже если они генерируют собственные значения AUTO_INCREMENT. Такое поведение гарантирует, что каждый клиент может получить свой собственный идентификатор, не заботясь об активности других клиентов и не нуждаясь в блокировках или транзакциях.
Лучше использовать транзакцию, если какой-либо запрос не выполнен, по крайней мере, другие обновления можно откатить.
ИЛИ справиться самостоятельно
Если шаг 3 завершится неудачно, вы получите сообщение об ошибке из mysql, сохраните это сообщение в переменной и проверьте, что в случае получения удалите запись, вставленную в 1 шаг.
Это все, что обрабатывать транзакции. Вы должны использовать транзакцию.