блокировка записей многопользовательских приложений - лучший метод? - PullRequest
3 голосов
/ 21 марта 2009

Я разрабатываю приложение php / mysql, которое обрабатывает несколько одновременных пользователей. Я думаю о лучшем подходе к блокировке / предупреждению записей, которые в настоящее время просматриваются / редактируются.

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

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

Я предполагаю, что должна существовать какая-то форма ajax, чтобы «пинговать» приложение и дать ему знать, что запись все еще просматривается / редактируется (в противном случае пользователь может просто закрыть окно своего браузера, а затем узнать, как приложение узнает тот).

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

Возможно, я ошибаюсь с точки зрения решения - какое у людей опыт реализации этого (что должно быть довольно распространенного) требования?

Ответы [ 3 ]

6 голосов
/ 21 марта 2009

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

1 голос
/ 21 марта 2009

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

Возможно, стоит сохранить имя пользователя для каждого обновления в поле, называемом «LastUpdateBy», и вернуть его обратно пользователю, у которого было установлено обновление. Просто небольшая приятность для пользователя. Хороший в корпоративном смысле, возможно, не в среде, где это может быть неуместно.

...