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




MySQL.RU - Webboard



Вернуться
регистрация пользователя (edart) 10/02/2006 - 11:42:08
      Re: регистрация пользователя (DNick) 10/02/2006 - 14:08:44
      Re: регистрация пользователя (edart) 10/02/2006 - 18:31:23
      Re: регистрация пользователя (edart) 10/02/2006 - 19:10:24
      Re: регистрация пользователя (DNick) 14/02/2006 - 19:04:45
      Re: регистрация пользователя (edart) 14/02/2006 - 19:35:47
      Re: регистрация пользователя (DNick) 14/02/2006 - 21:58:28
      Re: регистрация пользователя (edart) 17/02/2006 - 09:33:58
      Re: регистрация пользователя (DNick) 18/02/2006 - 11:35:23
      Re: регистрация пользователя (DNick) 18/02/2006 - 11:55:09
      Re: регистрация пользователя (edart) 20/02/2006 - 18:48:56

> Original message text:
> From: edart - 10/02/2006 - 11:42:08
> Subject:регистрация пользователя
> -----------------
> При регистрации пользователя через веб-форму посредством рнр-скрипта я делаю так:
> 1. получаю последний имеющий в таблице uid
> select max(uid) from users
> 2. Увеличиваю его на 1
> $new_uid = 'результат запроса' + 1
> 3. Регистрирую пользователя, т.е.
> insert into users set uid=$new_uid и блаблабла
>
> Разрабатывая скрипт на рнр для регистрации на фтп, понял, что вполне возможна ситуация одновременного получения одного и того же uid сразу несколькими пользователями. Что может привести к созданию одинакового uid'а. А это не есть хорошо.
>
> В приниципе сам uid уникален только внутри группы, т.е. uid+gid само по себе значение уникальное, хотя я не отслеживаю уникальность этой пары средствами сервера бд. Ключевое поле у меня userid фактически логин пользователя на доступ по фтп (использую proftpd with mysql на freebsd)
>
> Вероятно можно использовать auto_increment по полю uid. Но оно должно быть ключевое.
>
> Можно ли решить проблему без использования auto_increment. Например включением блокировки, однако не знаю как это правильно делать
>


From: DNick - 18/02/2006 - 11:55:09
Subject:регистрация пользователя
-----------------
Проиллюстрировать можно так

Надо создать запись в таблице tab1 с "уникальным" suid
1. Выбираем первоначально suid
select max(suid)+1 from tab1 ---> maxsuid
2. создаем блокировку
insert into myblock(table,type,params,td) values('tab1','new',maxsuid,now()) ----> nblock(номер записи в таблице myblock)
3. Проверяем нет ли уже блокировки
select ... from myblock where table='tab1' and params =maxsuid
(Должно вернуть 1 запись, в противном случае уже есть блокировка необходим удалить свою блокировку, и решать что делать, либо ждать завершения блокирующего сеанса либо)
4. Проверяем неуспелили уже создать запись с таким suid
select ... from tab1 where suid=maxsuid
(Должно быть 0 записей, если нет, удаляем свою блокировку и переходим к п.1)

Ну вот, если все предыдущие пункты успешно прошли, то блокировка создана, и никакое приложение работающее по этому алгоритму не накосячит.
5. Выполняем действия ради которых мы и создавали блокировку.
6. Завершаем блокировку(удаляем запись из myblock)


P.S. Ну приблизительно вот так и организуется работа в объектных СУБД, где реализованы построчные, и прочие виды нетабличных блокировок. За исключением того что обычно для СУБД не требуется проверка в п.4, т.к. там используют более действеные способы реализации блокирования объектов. Тем более что реально запись данных проходит одним процессом, несмотря что работающих соединений может быть много, вот на его уровне и блокируют данные.


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

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

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



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