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

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

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

Вы не зашли.

#1 15.12.2011 14:13:07

iliyaisd
Участник
Зарегистрирован: 15.12.2011
Сообщений: 7

Одновременное сохранение

Добрый день. Господа, подскажите такой нюанс, ибо туплю.
Есть база данных на mySQL. Возможен ли следующий расклад? Я хочу сохранить данные о пользователе, получаю в таблице последний свободный ИД. В это время одновременно другой пользователь сохраняет данные, т.е. последний свободный ИД уже на 1 больше. Я сохраняю и обламываюсь, т.к. ИД уже занят.

Неактивен

 

#2 15.12.2011 14:52:40

deadka
Администратор
Зарегистрирован: 14.11.2007
Сообщений: 2422

Re: Одновременное сохранение

Воспользуйтесь полем auto_increment в качестве id.


Зеленый свет для слабаков, долги отдают только трусы, тру гики работают только в консоли...

Неактивен

 

#3 15.12.2011 14:56:39

iliyaisd
Участник
Зарегистрирован: 15.12.2011
Сообщений: 7

Re: Одновременное сохранение

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

Неактивен

 

#4 15.12.2011 14:58:33

deadka
Администратор
Зарегистрирован: 14.11.2007
Сообщений: 2422

Re: Одновременное сохранение

last_insert_id() в помощь - узнать под каким номером сохранена запись.


Зеленый свет для слабаков, долги отдают только трусы, тру гики работают только в консоли...

Неактивен

 

#5 15.12.2011 16:47:59

iliyaisd
Участник
Зарегистрирован: 15.12.2011
Сообщений: 7

Re: Одновременное сохранение

Интересная штука. А если так:
1. Я делаю инсерт с авто инкрементом.
2. Другой пользователь успевает сделать инсерт с авто инкрементом.
3. Я вызываю last_insert_id() и получаю ид другого пользователя?

Неактивен

 

#6 15.12.2011 16:58:19

deadka
Администратор
Зарегистрирован: 14.11.2007
Сообщений: 2422

Re: Одновременное сохранение

Затрудняюсь привести пруфлинк, но читал, что insert id - это атрибут сессии.
Так что select last_insert_id() вернет последний auto_increment от insert'a текущего клиента.
Даже если другие пользователи будут вставлять свои записи между Вашим insert'ом и select last_insert_id(), Вы должны получить insert_id от своего ввода.


Зеленый свет для слабаков, долги отдают только трусы, тру гики работают только в консоли...

Неактивен

 

#7 15.12.2011 19:54:17

iliyaisd
Участник
Зарегистрирован: 15.12.2011
Сообщений: 7

Re: Одновременное сохранение

В таком случае, отличное решение. Спасибо!

Неактивен

 

#8 17.12.2011 19:10:27

Neval
Гуру
Откуда: Киев
Зарегистрирован: 11.03.2008
Сообщений: 449

Re: Одновременное сохранение

Если не используется постоянное соединение, то проблем не возникнет.


Человек без чувства юмора - не серьёзный человек wink

Неактивен

 

#9 18.12.2011 15:41:45

iliyaisd
Участник
Зарегистрирован: 15.12.2011
Сообщений: 7

Re: Одновременное сохранение

Вот, кстати, возникла, и именно на этой почве. Сохраняю одну таблицу с автоинкрементом, получаю last_insert_id, затем другую, а функция снова возвращает значение id от первой. Как решить? Только рвать коннект с MySQL?

Неактивен

 

#10 19.12.2011 00:12:52

Neval
Гуру
Откуда: Киев
Зарегистрирован: 11.03.2008
Сообщений: 449

Re: Одновременное сохранение

Т.е. именно при постоянном соединении? Рвать коннект конечно же будет не правильно, т.к. он порвёт коннекты всех клиентов, которы подключены на данный момент.
По-моему, при постоянном соединении лучше не играться с автоинкрементом smile


Человек без чувства юмора - не серьёзный человек wink

Неактивен

 

#11 19.12.2011 13:46:43

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

Re: Одновременное сохранение

Защитите id ограничением первичного ключа и не будет никаких проблем совместного доступа.

Неактивен

 

#12 19.12.2011 18:46:54

Neval
Гуру
Откуда: Киев
Зарегистрирован: 11.03.2008
Сообщений: 449

Re: Одновременное сохранение

А Вы все посты прочитали и восприняли прежде чем такое писать? big_smile


Человек без чувства юмора - не серьёзный человек wink

Неактивен

 

#13 20.12.2011 14:18:36

iliyaisd
Участник
Зарегистрирован: 15.12.2011
Сообщений: 7

Re: Одновременное сохранение

Я так понимаю, придётся делать блокировки таблиц (по крайней мере, одной из них - второй).

Неактивен

 

#14 23.12.2011 17:06:03

iliyaisd
Участник
Зарегистрирован: 15.12.2011
Сообщений: 7

Re: Одновременное сохранение

Ещё погуглил, решил заюзать хранимые процедуры. Подскажите, являются ли они по умолчанию атомарными?

Неактивен

 

#15 23.12.2011 17:31:06

paulus
Администратор
MySQL Authorized Developer and DBA
Зарегистрирован: 22.01.2007
Сообщений: 6757

Re: Одновременное сохранение

Нет, процедура выполняется так, как если бы Вы выполняли все команды последовательно.

Неактивен

 

Board footer

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