Новости
Документация
Download
Webboard
Поиск
FAQ/ЧаВо
Обратная связь




MySQL.RU - Webboard



Вернуться
last_insert_id - он уникален для ...(+) (Сугубый) 17/07/2003 - 14:59:03
      Re: last_insert_id - он уникален для ...(+) (Валентин) 17/07/2003 - 15:24:02
      Re: last_insert_id - он уникален для ...(+) (walrus) 17/07/2003 - 16:31:35
      Re: last_insert_id - он уникален для ...(+) (Сугубый) 17/07/2003 - 16:36:39
      Re: last_insert_id - он уникален для ...(+) (Валентин) 17/07/2003 - 17:08:38
      Re: last_insert_id - он уникален для ...(+) (walrus) 17/07/2003 - 18:51:29
      Re: last_insert_id - он уникален для ...(+) (Dinky) 18/07/2003 - 01:25:09
      Re: last_insert_id - он уникален для ...(+) (walrus) 18/07/2003 - 02:31:32
      Re: last_insert_id - он уникален для ...(+) (Vodkin) 18/07/2003 - 12:40:07
      Re: last_insert_id - он уникален для ...(+) (Dinky) 18/07/2003 - 18:11:58

> Original message text:
> From: Сугубый - 17/07/2003 - 14:59:03
> Subject:last_insert_id - он уникален для ...(+)
> -----------------
> Доброго времени суток!
>
> Здесь такое дело: веб приложение, коннект к базе один, на каждый HTTP запрос к странице создается курсор (работаем в технологии ZOPE). На страничке выполняется что-то типа:
> INSERT INTO table1 (mess) values ('сообщение пользователя');
> INSERT INTO table2 (ref_id, ...) values (last_insert_id(), ...);
> (table2.ref_id является форейн кеем к table1.id, который AUTO INCREMENT)
>
> Так вот вопрос следующий: last_insert_id - он уникален для коннекта или для курсора? В доке написано: "Значение последнего сгенерированного ID сохраняется на сервере для данного конкретного соединения и не будет изменено другим клиентом." Значит ли это что при интенсивных конкурирующих запросах на одном коннекте возможно перемешивание last_id?
>
> А если уникальность гарантируется на соединение, то может кто сталкивался (задачка-то достаточно стандартная) - как решали?
>
> Заранее спасибо.
>
>


From: Валентин - 17/07/2003 - 17:08:38
Subject:last_insert_id - он уникален для ...(+)
-----------------
Давайте введем несколько констант.
1)MyIsam не поддерживают транзакций.
2)Auto_increment назначает мускул перед вставкой в таблицу по схеме select @new:=max(ID)+1 from table1 и помещает при или после(точно не знаю, нужно смотреть сырцы) физического помещения индексной записи в заголовок таблицы.
я сомневаюсь, что технология ZOPE в сессии не посылает фактический запрос к мускулу для вызова функции last_insert_id().
Поэтому мускул считает это значение из заголовка таблицы, где будет последний ID вставленной записи, даже если в очереди готовится к вставке другая. Для myIsam записи будут добавлятся также по очереди времени получения запроса на запись.
Если за время передачи данных будет добавлена еще запись, то клиент об этом не узнает, пока еще раз не запросит последний вставленный ID. Это не будет зависеть не от мускула ни от технологии ZOPE.
Валрус прав, лучше блокировать таблицы на время выполнения двух вставок.Потому что если запросов действительно много, то второй вопрос может встать в очередь позже аналогичного запроса на добавление в таблицу 1 и получится неправильный ID.

Если возможно, то поместите все данные, которые вам нужно добавить в одну таблицу, тогда вопрос с блокировкой отпадет.


[Это сообщение - спам!]

Последние сообщения из форума

Уважаемые посетители форума MySQL.RU!
Убедительная просьба, прежде чем задавать свой вопрос в этом форуме, обратите внимание на разделы:
- ответы на наиболее часто задаваемые вопросы - FAQ
- раздел документация
- раздел поиск по сообщениям форума и документации
Также, старайтесь наиболее подробно указывать свою ситуацию (версию операционной системы, версию MySQL, версию программного обеспечения, по которому возникает вопрос, текст возникающих ошибок, и др.)
Помните, чем конкретнее Вы опишете ситуацию, тем больше шансов получить реальную помощь.
 Имя:
 E-mail:
 Тема:
 Текст:
Код подтверждения отправки: Code
9664



РЕКЛАМА НА САЙТЕ
  Создание сайтов | |