Как я могу запретить людям открывать запись, если кто-то другой открыл ее? - PullRequest
1 голос
/ 08 марта 2012

Я создаю веб-приложение PHP, которое включает:

1) Пользователи, открывающие запись

2) Пользователи, вносящие изменения в запись

3)Сохранение изменений в записи

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

Ответы [ 4 ]

2 голосов
/ 08 марта 2012

Я использую поле update_date. Когда пользователь читает запись, я пишу печенье с этой датой. Когда пользователь обновляет запись и представляет новые данные, я добавляю WHERE update_date = '$my_escaped_date' AND id = '$the_edited_id', а если mysql_affected_rows равен нулю, я показываю сообщение об ошибке, что отредактированные данные старые Это не идеально, так как если вы редактируете старые данные, вы должны повторно ввести их, но это делает свою работу.

2 голосов
/ 08 марта 2012

Под записью вы имеете в виду записи SQL? Если это так, вы можете добавить еще один столбец isOpen. Установите его на 1 до тех пор, пока кто-то еще его откроет, и в этом случае не передавайте его другим лицам.

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

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

В ответ на ваш комментарий

Чтобы сделать запись доступной для других, когда активный пользователь уходит прочь, мне нужно подумать о двух способах ее достижения:

  • Позвольте механизму тайм-аута позаботиться об этом. В зависимости от вашего сценария достаточно короткое временное окно может работать нормально.
  • В дополнение к тайм-ауту также реализуйте механизм пульса - Ajax-скрипт на странице опрашивает сервер, сообщая ему, что страница все еще открыта. Если пользователь уходит, сервер распознает пропущенное сердцебиение и сбрасывает запись. В этом случае тайм-аут все равно будет иметь приоритет. Таким образом, если пользователь оставляет окно открытым и уходит, сервер все равно получит пульс, но когда окно времени закроется, сервер сбрасывает запись (несмотря на то, что пульс по-прежнему получает).
1 голос
/ 08 марта 2012

Метод блокировки - это именно то, что доступно в mysql:

http://dev.mysql.com/doc/refman/5.0/en/lock-tables.html

Это не автоматический режим, но он позволяет блокировать таблицу, выполнять какие-либо операции, а затем снова разблокировать ее.1006 *

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

Лучшим способом может быть чтение данных из таблицы и после отправки формы проверить, не изменились ли данные.Если он есть, вы можете уведомить пользователя об изменениях, и в противном случае вы можете заблокировать таблицу, выполнить изменения и снова разблокировать ее.

0 голосов
/ 08 марта 2012

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

Если значение равно 1 -запись заблокирована и не будет открыта для других пользователей.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...