2013-03-23 5 views
-2

у меня есть процедура регистрации на базе данных MySQL и работает следующим образом:будет работать функция LAST_INSERT_ID?

INSERT INTO `tblusers` (`uname`, `upwd`, `umail`) VALUES (RU_UNAME, RU_UPWD, RU_UMAIL); 
select LAST_INSERT_ID() into @newuserid; 

-- then use the @newuserid to make some work on other tables. 

Теперь мне было интересно, будет ли когда-нибудь неправильный идентификатор специально, что база данных будет иметь много вставок в других таблицах, то его может получить идентификатор другой таблицы, вставленной между вставкой пользователя и получением последнего вставленного идентификатора?

есть ли шанс отказа?

ответ

1

Одним словом, нет. Различные подключения к базе данных поддерживают свои собственные отдельные LAST_INSERT_ID. Поэтому некоторые другие клики, вставляющие записи в tblusers, не будут влиять на ваш LAST_INSERT_ID.

От documentation:

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

documentation стоит прочитать. Это говорит о многом.

0

MySQL использует систему блокировки, которая не позволяет выполнять 2 процесса (2 вызова сценария) для изменения одной и той же строки. Таким образом, таблица не будет разбиваться *, но возможно, что MySQL не может обрабатывать количество запросов в разумные сроки и запросы будут ждать. Вы всегда должны оптимизировать свои запросы как можно быстрее.

Итак, последний вставленный идентификатор не удался.

Смежные вопросы