SQLinfo.ru - Все о MySQL Webew.ru: теория и практика веб-технологий

Форум пользователей MySQL

Задавайте вопросы, мы ответим

Вы не зашли.

#1 09.01.2013 17:24:24

new_saler
Участник
Зарегистрирован: 14.11.2012
Сообщений: 23

Поведение LAST_INSERT_ID() при многопольз. доступе

Подскажите пожалуйста какое значение вернет функция LAST_INSERT_ID() после вставки записи.

Конкретно: делаем вставку данных

INSERT INTO table1 VALUES(NULL, alex, message);
SELECT LAST_INSERT_ID();


Если первый пользователь сайта вставил запись, то мне непременно нужно получить id ИМЕННО этой записи.

Не получится ли так, что во время вставки первым позьзователем записи, ВТОРОЙ пользователь сайта еще вставит запись и функция LAST_INSERT_ID() вернет значение id не первой записи, А второй либо какой-нибудь другой, если пользователей одновременно МНОГО.

Искал в интернете ответ: много где пишут, что да, путаница вполне возможна.
А в мануале MySQL http://dev.mysql.com/doc/refman/5.0/en/ … ue-id.html написано:

For LAST_INSERT_ID(), the most recently generated ID is maintained in the server on a per-connection basis. It is not changed by another client. It is not even changed if you update another AUTO_INCREMENT column with a nonmagic value (that is, a value that is not NULL and not 0). Using LAST_INSERT_ID() and AUTO_INCREMENT columns simultaneously from multiple clients is perfectly valid. Each client will receive the last inserted ID for the last statement that client executed.

В английском не силён (переводчик юзал), так что боюсь ошибиться в верном ответе...

Отредактированно new_saler (09.01.2013 17:30:13)

Неактивен

 

#2 09.01.2013 17:30:11

rgbeast
Администратор
MySQL Authorized Developer and DBA
Откуда: Москва
Зарегистрирован: 21.01.2007
Сообщений: 3880

Re: Поведение LAST_INSERT_ID() при многопольз. доступе

LAST_INSERT_ID() будет верным для данной сессии, то есть это последний id в данной сессии. Использовать его безопасно с точки зрения одновременных подключений.

Неактивен

 

#3 09.01.2013 17:45:48

new_saler
Участник
Зарегистрирован: 14.11.2012
Сообщений: 23

Re: Поведение LAST_INSERT_ID() при многопольз. доступе

Спасибо за быстрый ответ!

rgbeast написал:

LAST_INSERT_ID() будет верным для данной сессии, то есть это последний id в данной сессии. Использовать его безопасно с точки зрения одновременных подключений.

В данном случае сессия - имеется ввиду подключение пользователя?

Допустим: есть скрипт, который вставляет данные в одну таблицу и в этом же скрипте последний вставленный АВТОИНКРЕМЕНТОМ ID считывается и вставляется в другую таблицу.

Если к данному скрипту подключилось 100 пользователей и каждый почти одновременно произвел вставку данных в эту таблицу, то получается для каждого из ста пользователей идентификатор ID последней вставленной записи будет храниться в памяти именно ЕГО (до завершения работы скрипта) и во вторую таблицу вставятся соответственные и верные данные?


Извините, что столь подробно спрашиваю, но нужно достоверно убедиться правильно ли я понимаю действие этой функции.
Еще раз спасибо.

Отредактированно new_saler (09.01.2013 17:50:25)

Неактивен

 

#4 09.01.2013 17:52:55

rgbeast
Администратор
MySQL Authorized Developer and DBA
Откуда: Москва
Зарегистрирован: 21.01.2007
Сообщений: 3880

Re: Поведение LAST_INSERT_ID() при многопольз. доступе

Скрипт будет каждый раз создавать подключение к MySQL и LAST ID будет свой в рамках каждого подключения. Если нужна достоверность, протестируйте скрипт на нагрузке.

Неактивен

 

#5 11.01.2013 12:44:26

ita
Участник
Зарегистрирован: 24.09.2008
Сообщений: 19

Re: Поведение LAST_INSERT_ID() при многопольз. доступе

Если Вы хотите получить сгенерированное Вами ID до того, как другой пользователь будет добавлять свои записи, значит, нужно всем остальным пользователям запретить добавлять записи, пока Вы не завершите Вашу транзакцию. Значит оба оператора:
INSERT INTO table1 VALUES(NULL, alex, message);
    SELECT LAST_INSERT_ID();
( а может быть и еще какие-то операторы)
должны выполнятся как одна транзакция.
В этом случае только после завершения транзакции будут сняты все блокировки, и другой пользователь сможет добавлять записи. И тогда Вы получите свое ID. Читайте управление транзакциями в MySQL.

Неактивен

 

#6 11.01.2013 16:17:14

rgbeast
Администратор
MySQL Authorized Developer and DBA
Откуда: Москва
Зарегистрирован: 21.01.2007
Сообщений: 3880

Re: Поведение LAST_INSERT_ID() при многопольз. доступе

LAST_INSERT_ID() будет в любом случае вашим вставленным id, даже если кто-то вставил еще записи. Транзакция позволит обеспечить синхронность на более высоком уровне, но в простых случаях не является необходимой.

Неактивен

 

Board footer

Работает на PunBB
© Copyright 2002–2008 Rickard Andersson