![]() |
|
Модераторы: skyboy, MoLeX, Aliance, ksnk |
![]()
|
|
| linuxoid |
|
|||
|
Бывалый ![]() Профиль Группа: Участник Сообщений: 180 Регистрация: 17.4.2005 Репутация: нет Всего: нет |
Здравствуйте коллеги! У меня такой вопрос: на сайте много пользователей, которые пишут сообщения. Если все ОК с валидацией, то заносим сообщение пользователя в базу. Затем мне нужен id этого сообщения из базы. Я просто беру max(id). Проблема следующая: если одновременно много пользователей добавляют сообщения, то по случайности может оказаться, что этот max(id) является id сообщения другого пользователя. Т.к. он успел написать новое сообщение и добавить его именно в тот момент, когда в базу добавлялось еще предыдущее (или любая другая причина). Т.е. по идее есть вероятность того, что я получу неверный id. Как нужно правильно сделать, чтобы я 100% был уверен, что id взят именно того сообщения, которое сейчас было вставлено. Нужно использовать транзакции? Если да, то можно ли оставить выборку max(id) как есть? Т.е. текущий код абсолютно тот же, но просто разместить все в одной транзакции.
Благодарствую за внимание. |
|||
|
||||
| DimW |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1330 Регистрация: 24.2.2005 Где: Орёл Репутация: нет Всего: 44 |
причем стопроцентная. т.е. вы полагаете что при добавлении сообщений вы транзакции не используете? linuxoid, вы про автоинкрименты, генераторы, последовательности что нить слышали? |
|||
|
||||
| skyboy |
|
|||
|
неОпытный ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 9820 Регистрация: 18.5.2006 Где: Днепропетровск Репутация: 14 Всего: 260 |
укажи СУБД и целевой язык(Mysql+PHP, Delphi+Paradox, C#+SQL Server). быстрее получишь решение, привязанное к используемым технологиям.
а на абстрактный вопрос получишь абстрактный же ответ |
|||
|
||||
| linuxoid |
|
|||
|
Бывалый ![]() Профиль Группа: Участник Сообщений: 180 Регистрация: 17.4.2005 Репутация: нет Всего: нет |
База postgres или mysql. Все на php. Транзакции я не использую. Вот пример для Postgres'a.
Это сообщение отредактировал(а) linuxoid - 6.7.2010, 10:59 |
|||
|
||||
| skyboy |
|
|||
|
неОпытный ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 9820 Регистрация: 18.5.2006 Где: Днепропетровск Репутация: 14 Всего: 260 |
что стоило разместить вопрос в разделе "РНР: БАзы данных"? теперь ждем модератора этого раздела
РНР. хорошо. а какие функции используются? mysql_query? PDO? ADOLite? для семейства функций mysql_* есть функция mysql_last_insert_idmysql_insert_id. в самой mysql есть функция last_insert_id()(но я не помню - надо смотреть, как себя ведет функция в условиях нескольких подключений от имени одного пользователя; скорее всего, работает нормально, но все же лучше убедиться) а в postgresql, вроде как, сначала получаешь значение sequence при помощи nextval, а потом уже вставляешь запись. при этом полученное значение будет точно уникальным. Это сообщение отредактировал(а) skyboy - 6.7.2010, 14:32 |
|||
|
||||
| linuxoid |
|
|||
|
Бывалый ![]() Профиль Группа: Участник Сообщений: 180 Регистрация: 17.4.2005 Репутация: нет Всего: нет |
Спасибо. Становится яснее, что нужно использовать более специализированные функции, которые конкретно связаны с инкрементом. Но как быть с "Далее с этим id я вставляю дальше в другие таблицы базы различные сведения.". Стоит ли мне ознакомиться с транзакциями поближе? Т.е. правильно ли я думаю, что нужно их использовать в моем случае.
P.S. В PHP использую только стандартные функции pg_ и mysql_ |
|||
|
||||
| skyboy |
|
|||
|
неОпытный ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 9820 Регистрация: 18.5.2006 Где: Днепропетровск Репутация: 14 Всего: 260 |
транзакции - это другое.
получив идентификатор только что вставленной записи при помощи mysql_last_insert_id(), сформировать нужные тебе запросы с этим значением. в чем, собственно, проблема? |
|||
|
||||
| linuxoid |
|
||||
|
Бывалый ![]() Профиль Группа: Участник Сообщений: 180 Регистрация: 17.4.2005 Репутация: нет Всего: нет |
Согласен.
Извиняюсь за назойливость, но т.е. получается, что используя к примеру mysql_insert_id() исключается проблема, что в этот момент другой пользователь вставил сообщение и я могу случайно получить id другого сообщения - т.е. всегда будет именно нужный id? |
||||
|
|||||
| skyboy |
|
|||
|
неОпытный ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 9820 Регистрация: 18.5.2006 Где: Днепропетровск Репутация: 14 Всего: 260 |
||||
|
||||
| linuxoid |
|
|||
|
Бывалый ![]() Профиль Группа: Участник Сообщений: 180 Регистрация: 17.4.2005 Репутация: нет Всего: нет |
Ok, благодарю!
|
|||
|
||||
| gcc |
|
|||
![]() Агент алкомафии ![]() ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 2691 Регистрация: 25.4.2008 Где: %&й Репутация: нет Всего: 17 |
в Oracle есть по-моиму транзакция SELECT, чтобы выбрать 100% новую запись... (если это то, что надо)
Это сообщение отредактировал(а) gcc - 7.7.2010, 10:59 |
|||
|
||||
| gcc |
|
|||
![]() Агент алкомафии ![]() ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 2691 Регистрация: 25.4.2008 Где: %&й Репутация: нет Всего: 17 |
http://www.realcoding.net/article/view/1581 |
|||
|
||||
| krypt3r |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 359 Регистрация: 9.6.2009 Репутация: 1 Всего: 16 |
для постгреса
В php нет вроде функции, аналогичной mysql_insert_id() |
|||
|
||||
![]()
|
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | PHP: Базы Данных | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |