Интерфейс к БД и проблема многопользовательского доступа

841kks

Новичок
Приветствую участников форума.
Если есть возможность прошу помочь.

У меня есть бд (MySQL или SQlite) b web-интерфейс для работы с данными из базы. Система многопользовательская.

Собственно, у меня два вопроса:

1. Как можно правильно реализовать запрет изменения одних и тех же данных одновременно несколькими пользователями? Т.е. пользователь 1 заходит на форму и начинает редактировать запись в бд. в это же время пользователь 2 заходит тоже на форму и тоже начинает изменять данные.
С точки зрения интерфейса, все понятно, если кто-нибудь из пользователей начал редактировать запись в бд, то для остальных форма для редактирования должна быть недоступна. А как реализовать это программно? т.е. в каждой таблице в бд делать отдельное поле (флаг) и когда пользователь заходит на форму редактирования, помечать этот флаг, и при попытке другого пользователя зайти на форму редактирования проверять этот флаг и не давать доступ к форме редактирования?
Я думаю, что такая ситуация стандартная и она стандартно должна как-то решаться.

2. Есть таблица в которой отображаются записи из бд. Таблицу смотрят несколько пользователей. Один из пользователей внес изменения в базе, как программно можно сделать, чтобы у всех пользователей обновился интерфейс и пользователи видели уже таблицу с измененными данными.
В программе для PC понятно как сделать, при внесении изменений в базе устанавливается какой-то флаг, запустить таймер в котором будет опрашиваться значение этого флага, и если он изменился, то в пользовательском интерфейсе обновить таблицу или просто выдать уведомление, что данные в базе изменились.
А как это грамотно реализовать для web-интерфейса средствами php и java скриптов?
Понятно что можно сделать кнопку "Обновить" (чтобы обновить таблицу с новыми данными из базы) но надо все равно как-то понять пользователям что кто-то изменил данные и надо обновить таблицу.

Очень надеюсь на помощь. Прошу сильно не критиковать, если спрашиваю элементарные вещи, я ищу примеры решения моих вопросов, чтобы можно было на примере понять суть как это грамотно реализовать.
Недавно разобрался с технологией Ajax, и теперь активно применяю это в своей работе, хотелось бы найти ответы на два своих вопросах, чтобы понимать механизм и использовать это в своей работе.

Всем откликнувшимся заранее огромное спасибо.
 

c0dex

web.dev 2002-...
Команда форума
Партнер клуба
841kks
1. В таблице хранить последнее время изменения данных. При заходе первого юзера ставим ему переменную куда-нибудь, типа load_time равную времени последнего редактирования записи из базы. Далее заходит другой юзер, получает такой же штамп в load_time, что и первый. Первый делает сохранение-обновление данных при котором сверяется дата в базе и в load_time юзера, если они равны, ставится новый штамп о редактировании в бд, изменяется сама инфа. Далее при попытке второго юзера сохранить данные делается такая же проверка для него, при которой выяснится, что у него load_time просрочен, потому выкидываем ему предупреждение, о том, что с его времени загрузки контента, его уже поменяли.

2. Опрашивать сервер раз в -дцать секунд через AJAX, обновлять страницу, гоняя от сервера до клиента JSON массив, как вариант.
 

841kks

Новичок
841kks
1. В таблице хранить последнее время изменения данных. При заходе первого юзера ставим ему переменную куда-нибудь, типа load_time равную времени последнего редактирования записи из базы. Далее заходит другой юзер, получает такой же штамп в load_time, что и первый. Первый делает сохранение-обновление данных при котором сверяется дата в базе и в load_time юзера, если они равны, ставится новый штамп о редактировании в бд, изменяется сама инфа. Далее при попытке второго юзера сохранить данные делается такая же проверка для него, при которой выяснится, что у него load_time просрочен, потому выкидываем ему предупреждение, о том, что с его времени загрузки контента, его уже поменяли.

2. Опрашивать сервер раз в -дцать секунд через AJAX, обновлять страницу, гоняя от сервера до клиента JSON массив, как вариант.
Спасибо за совет.
 

Royal Flash

-=MaestrO=-
1. В таблице хранить последнее время изменения данных.
Вариант не плохой, но вот что делать второму юзеру, если он вбил уже пачку контента и не может его записать, так как: "выкидываем ему предупреждение, о том, что с его времени загрузки контента, его уже поменяли"? Ведь не все же можно сохранить в блокноте, фотки например?

Я бы предложил 841kks все-же блокировать редактируемую запись от внесения изменений в нее другими пользователями методом установки флага (например ID юзера, который редактирует) и временем, когда этот процесс начат. Поскольку всеравно будет использоваться AJAX для обновления раз в 20 сек, его же можно "прикрутить" и к форме обновления: каждые 20 сек., проверять, открыта ли форма у юзера, а еще лучше, каждые 1-2 минуты записывать введенные данные, менять время последнего изменения вместе с проверкой открытости формы.
 

c0dex

web.dev 2002-...
Команда форума
Партнер клуба
Заметьте, я не писал, что юзер сохранить контент не может, не надо меня перевирать. Я написал что ему выдается warning, который вовсе не обязан блокировать сохранение.
Потому самый нормальный вариант - это при случае, если до него уже данные изменяли, выкатить ему изменения, показать текст там и прочее, а вот после - дать возможность или отказаться от изменений или сохранить. Причем есть возможность, взять поля частично из уже сохраненных данных, перенести в те, что он редактирует и сохранить. Все зависит от квалификации и фантазии.

Глупей предложения не видел. Если юзер открыл форму просто так, посмотреть все данные, что-то выделил, стер или еще что, а система возьми да сохрани, хотя юзеру оказалось потом этого делать не надо было. И? Жопа ...
Факт два, твоя блокировка нафиг не нужна никому, почему? Потому, что запись могут открыть, и уйти обедать, а данные уже хрен сохранишь под другим юзером, я правильно понял?
 

Royal Flash

-=MaestrO=-
Потому самый нормальный вариант - это при случае, если до него уже данные изменяли, выкатить ему изменения, показать текст там и прочее, а вот после - дать возможность или отказаться от изменений или сохранить. Причем есть возможность, взять поля частично из уже сохраненных данных, перенести в те, что он редактирует и сохранить. Все зависит от квалификации и фантазии.
Как вариант, да, но много гемора с переносом и синхронизацией. Все зависит от того, что именно нужно.

Глупей предложения не видел. Если юзер открыл форму просто так, посмотреть все данные, что-то выделил, стер или еще что, а система возьми да сохрани, хотя юзеру оказалось потом этого делать не надо было. И? Жопа ...
Ну уважаемый, по твоей логике, тогда в Microsoft (да и во многих других Soft-гигантах) работают одни глупцы, реализующие глупые предложения по автосохранению документов. Например в Word ты никогда не используеш автосохранение? Конечно, может быть большая Ж, если сделать, как в твоем примере. Но для этого, существую настройки, как в том же Word: использовать автосохранение или нет. Да и про временные файлы Word`a, которые создаются во время редактирования документа, что-нибуть слышал?

Факт два, твоя блокировка нафиг не нужна никому, почему? Потому, что запись могут открыть, и уйти обедать, а данные уже хрен сохранишь под другим юзером, я правильно понял?
Нафиг она не нужна в том случае, если сделать так, как ты говориш :) А ведь если немного додумать, то можно представить себе, что чтобы исключить вариант с обедом, блокировка может быть снята вторым юзером, если первый обедая, не вносил изменений (mysql_affected_rows после UPDATE автосохранения = 0). А вот когда уже обед закончился, первый юзер сел за монитор, то ему тем же аджаксом предупреждение на весь экран: "данные уже модифицируются юзером X". Без автосохранения такой вариант реализовать немного сложнее (чтобы предотвратиь потерю данных любого юзера), но опять таки, если немного подумать, то вариантов получится далеко не один (например по аналогии с временными файлами Word).

На мой взгляд, вариант с AJAX намного лучше (пользователь не получит шокирующей надписи, что с введенными им данными что-то не так), но опять таки следует все продумать до начала реализации, например, будет ли у всех пользователей JS, и если нет, то что тогда? :)
 

c0dex

web.dev 2002-...
Команда форума
Партнер клуба
Мы не офис пишем, больше всего разражает, когда сайт начинает открывать окошки сам, или что-то делать с информацией, меня об этом не спросив. Продукты от мелкомягкий давно известны своими вылетами на ровном месте. Да, я не использую Word, я даже Windows не использую) Про файлы слышал что они очень сильно меня раздражают, когда их накапливается с тонну и потом ворд не может понять где какой. Пытается восстановить документ не с того файла и опять валится в ноль, создавая очередной файл.

Если у пользователя не будет JS - ССЗБ и идет лесом.
 

Royal Flash

-=MaestrO=-
Да, согласен, не Офис - но мы берём из худшего все лучшее что там есть. Также автосохранение - это не патентированное изобритение Microsoft, если тебе так не нравится Word - приведу другой пример: OpenOffice. В защиту автосохранения вопрос: "никогда не приходилось крыть матом комп, за то, что он завис, не дав отправить данные из формы, набиваемые в течении 1-2 часов", ну или просто закончилось время действия сессии? :) Мне, приходилось, поэтому автосохранение, применяемое "с умом" - это добро!

Да и давай не отвлекаться от темы - я так понял, что возвразить на мои предложения с AJAX по существу не чем? А то назвать чужые мысли глупыми легче, чем признать свои заблуждения. :)
 

c0dex

web.dev 2002-...
Команда форума
Партнер клуба
Почему же, есть. Главное - зачем? Я просто не заблуждаюсь, у меня такая система была реализована в CRM, в агенстве недвижимости, где я работал.

Там пользователь мог вносить изменения, и увидев, что какие-то поля уже редактированы, после того, как он открыл форму, чтобы не перетирать данные, мог указать не обновлять те или иные, что разом снимало вообще идею блокировой, необходимости слать запросы на сервер и иные геморы.
 

Royal Flash

-=MaestrO=-
Я имел ввиду, что ты заблуждаешся (не прав, если по простому), в том, что не принимаеш иные варианты, которые ни вчем не уступают, а в чем-то и превосходят твои собственные. Я, например, не назвал твою идею г-ом, хоятя считаю, что моя реализация лучше и по функционалу, и по интерфейсу, потому, что она вполне может с успехом применятся на практике.

Конечно, если считать продукты Microsoft - г...о, не смотря на то, что ими пользуются миллионы людей, а свои идеальными (ну уж не знаю, сколько людей их юзает), то завышенная самооценка просто не дает возможности предположить, что ты можеш в чем-то ошибится, ну или что кто-то может придумать нечто лучше :).

Все твои замечания (по существу идеи) по AJAX, я довольно подробно опроверг.
 

c0dex

web.dev 2002-...
Команда форума
Партнер клуба
Да тут придумать то можно многое, только имхо автору это нафик не надо на данном этапе.

А про AJAX - я предпочитаю не делать лишних телодвижений, если их можно не делать.
 
  • Like
Реакции: craz
Сверху