Задавайте вопросы, мы ответим
Вы не зашли.
Добрый день. Господа, подскажите такой нюанс, ибо туплю.
Есть база данных на mySQL. Возможен ли следующий расклад? Я хочу сохранить данные о пользователе, получаю в таблице последний свободный ИД. В это время одновременно другой пользователь сохраняет данные, т.е. последний свободный ИД уже на 1 больше. Я сохраняю и обламываюсь, т.к. ИД уже занят.
Неактивен
Воспользуйтесь полем auto_increment в качестве id.
Неактивен
Не подходит, так как мне потом нужно знать, под каким номером сохранена запись. Сейчас вот нагуглил блокировки таблиц...
Неактивен
last_insert_id() в помощь - узнать под каким номером сохранена запись.
Неактивен
Интересная штука. А если так:
1. Я делаю инсерт с авто инкрементом.
2. Другой пользователь успевает сделать инсерт с авто инкрементом.
3. Я вызываю last_insert_id() и получаю ид другого пользователя?
Неактивен
Затрудняюсь привести пруфлинк, но читал, что insert id - это атрибут сессии.
Так что select last_insert_id() вернет последний auto_increment от insert'a текущего клиента.
Даже если другие пользователи будут вставлять свои записи между Вашим insert'ом и select last_insert_id(), Вы должны получить insert_id от своего ввода.
Неактивен
В таком случае, отличное решение. Спасибо!
Неактивен
Если не используется постоянное соединение, то проблем не возникнет.
Неактивен
Вот, кстати, возникла, и именно на этой почве. Сохраняю одну таблицу с автоинкрементом, получаю last_insert_id, затем другую, а функция снова возвращает значение id от первой. Как решить? Только рвать коннект с MySQL?
Неактивен
Т.е. именно при постоянном соединении? Рвать коннект конечно же будет не правильно, т.к. он порвёт коннекты всех клиентов, которы подключены на данный момент.
По-моему, при постоянном соединении лучше не играться с автоинкрементом
Неактивен
Защитите id ограничением первичного ключа и не будет никаких проблем совместного доступа.
Неактивен
А Вы все посты прочитали и восприняли прежде чем такое писать?
Неактивен
Я так понимаю, придётся делать блокировки таблиц (по крайней мере, одной из них - второй).
Неактивен
Ещё погуглил, решил заюзать хранимые процедуры. Подскажите, являются ли они по умолчанию атомарными?
Неактивен
Нет, процедура выполняется так, как если бы Вы выполняли все команды последовательно.
Неактивен