MySQL и PDO: теоретически PDO :: lastInsertId может дать сбой? - PullRequest
11 голосов
/ 09 мая 2011

Я обдумывал это некоторое время.

Рассмотрим веб-приложение огромных размеров, где, скажем, миллионы SQL-запросов выполняются каждую секунду.

Я запускаю свойкод:

$q = $db->prepare('INSERT INTO Table
                 (First,Second,Third,Fourth)
          VALUES (?,?,?,?)');
$q->execute(array($first,$second,$third,$fourth));

Затем сразу после этого я хочу получить автоматически увеличенный идентификатор этого последнего запроса:

$id = $db->lastInsertId();

Возможно ли сбой lastInsertId, т.е. получить идентификаторкакой-нибудь SQL-запрос вставки, который был выполнен между моими двумя блоками кода?

Вторичный:

Если это не удастся, что будет лучшим способомчтобы устранить эту возможную утечку?

Было бы безопаснее создать еще один SQL-запрос для извлечения правильного идентификатора из базы данных, просто чтобы быть уверенным?

Ответы [ 2 ]

18 голосов
/ 09 мая 2011

Всегда будет безопасно при условии, что реализация PDO не делает что-то действительно головокружительное. Следующее из информации MySQL о last_insert_id:

Идентификатор, который был сгенерирован, поддерживается на сервере для каждого соединения. Это означает, что значение, возвращаемое функцией данному клиенту, является первым значением AUTO_INCREMENT, сгенерированным для самого последнего оператора, влияющего на столбец AUTO_INCREMENT этим клиентом. На это значение не могут повлиять другие клиенты, даже если они генерируют собственные значения AUTO_INCREMENT. Такое поведение гарантирует, что каждый клиент может получить свой собственный идентификатор, не заботясь об активности других клиентов и не нуждаясь в блокировках или транзакциях.

4 голосов
/ 09 мая 2011

Нет.lastInsertId для каждого соединения не требует запроса к серверу - mysql всегда отправляет его обратно в своем ответном пакете.

Так что, если метод execute не выдает исключение, тогда вы гарантированноиметь правильное значение в lastInsertId.

Он никогда не даст вам идентификатор вставки чего-либо еще, если только ваш запрос по какой-то причине не удался (например, неверный синтаксис), и в этом случае он может дать вам идентификатор вставки изпредыдущий на том же соединении.Но не чей-либо еще.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...