Ojas2@codeproject Ответов: 2

Запретить нескольким пользователям доступ к одной записи


Я разработал asp.net веб-приложение, в котором я хочу запретить нескольким пользователям доступ к одной записи. На самом деле, когда я развернул его на локальном сервере, несколько пользователей могут получить доступ к одной и той же записи и внести свои изменения. Затем изменения, сделанные одним пользователем, перезаписываются изменениями, сделанными другим пользователем. я хочу сделать логику для того, чтобы если одна запись редактируется одним пользователем, то другой пользователь должен получить уведомление о том, что запись открыта <username>

Что я уже пробовал:

я пытался,
создал таблицу для хранения уникального идентификатора этой записи и идентификатора пользователя, открывшего эту запись.

Когда пользователь нажимает на ссылку для просмотра записи, я вставляю оба ключа в таблицу, а когда пользователь возвращается на домашнюю страницу, Я удаляю запись, которая вставлена в эту таблицу выше.

2 Ответов

Рейтинг:
1

Mahmoud_Gamal

Хорошо я думаю что ваше решение справедливо но установите тайм аут для редактирования или зарезервируйте его по идентификатору сеанса и онлайн статусу чтобы избежать установки блокировки навсегда если вы отключены также удалите


Рейтинг:
0

F-ES Sitecore

Проблема с используемым вами методом заключается в том, что он работает только тогда, когда пользователи делают все "правильно". Допустим, я редактирую запись, отвлекаюсь, иду обедать. Эти данные остаются заблокированными, и вы вечно преследуете пользователей, чтобы разблокировать их заблокированные записи. Вы могли бы реализовать процедуру очистки, которая выполняется каждый час и разблокирует вещи, заблокированные более определенного количества времени назад, но теперь ваша система становится все более сложной, и она по-прежнему не помогает пользователям, которые хотят редактировать данные, которые кто-то другой заблокировал, но больше не обновляет.

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

Это не идеально, человек, который сделал второе обновление, вероятно, будет раздражен тем, что ему придется предпринять дальнейшие действия (возможно, отказаться от своей формы и повторно загрузить ее), но, по крайней мере, это остановит людей, перезаписывающих работу друг друга, и вы могли бы реализовать умные возможности сравнения\слияния с вашим кодом.

Вы даже можете иметь гибрид обоих дизайнов, вы можете отметить в базе данных, когда строка начинала редактироваться, и когда другой человек идет редактировать те же данные, ему говорят: "пользователь XYZ начал редактировать эту запись 3 минуты назад". Это подчеркивает вероятность того, что редактирование данных может не сработать, но если в сообщении говорится: "пользователь XYZ начал редактировать эту запись 300 минут назад", то пользователь знает, что другой человек, вероятно, просто отказался от своей правки, поэтому их работа должна сработать.