Я видел функцию в различных веб-приложениях, включая Wordpress (не уверен?), Которая предупреждает пользователя, если он открывает статью/сообщение/страницу/независимо от базы данных, в то время как кто-то другое редактирует одни и те же данные одновременно.Запретить двум пользователям редактировать одни и те же данные
Я хотел бы реализовать ту же функцию в своем приложении, и я немного подумал. Является ли следующий пример хорошей практикой в том, как это сделать?
Это идет немного что-то вроде этого:
1) User A
входит страницы при редактировании таинственной статьи X. В таблице Events
базы данных запрошены, чтобы убедиться, что никто не редактирует ту же страницу для момент, к которому никто не относится. Затем токен генерируется случайным образом и вставляется в таблицу базы данных, называемую Events
.
1) User B
также хочет, чтобы сделать обновление к статье X. Теперь, так как наш User A
уже редактируют статью, то Events
таблица опрашивается и выглядит следующим образом:
| timestamp | owner | Origin | token |
------------------------------------------------------------
| 1273226321 | User A | article-x | uniqueid## |
2) Отметка в настоящее время проверено. Если она действует и меньше, чем, скажем 100 секунд назад, появляется сообщение, и пользователь не может вносить изменения в текст статьи X:
Warning: User A is currently working with this article. In the meantime, editing cannot be done. Please do something else with your life.
3) Если пользователь А решает пойти дальше и сохранить свои изменения, маркер публикуется вместе со всеми другими данными для обновления базы данных и переключает запрос на удаление строки с помощью токена uniqueid##
. Если он решает сделать что-то другое вместо того, чтобы совершать свои изменения, статья X будет по-прежнему доступна для редактирования за 100 секунд для User B
Позвольте мне знать, что вы думаете об этом подходе!
Желаю всем отличного выходного дня!
Ну нет, задержка в 100 секунд была всего лишь примером, так что это может быть немного нереалистично при сложном обновлении статьи. Как бы вы это сделали? – Industrial
Не имеет значения, взяли ли вы 100 секунд как «просто пример». Дело в том, что не существует ни одного такого промежутка времени, о котором вы можете смело сказать: «По прошествии этого времени я могу быть уверенно уверен, что этот редактор больше не редактирует эту статью» (И это освободит статью в разумное время для редактирования для последующих редакторов, которые хотят сделать над ним настоящую работу). То, что вы хотите сделать, имеет большое сходство с тем, что «оставляющие блокировки ожидаются, пока транзакция ожидает ввода пользователя». И это считается очень плохой технологией проектирования. –
Seb предложил возможность «блокировки взлома», то есть возможность для B заблокировать блокировку A без явного удовлетворения согласия A. Вы можете это сделать, но в некоторых случаях все может стать своего рода соревнованием по боксу между конкурирующими пользователями. Предоставление третьим сторонам просто «разбить» то, что я делаю, даже не уведомив меня, не является также самым политическим решением. –