Как реализовать пессимистическую блокировку в веб-приложении php / mysql? - PullRequest
6 голосов
/ 17 ноября 2011

Как реализовать пессимистическую блокировку в веб-приложении php / mysql?

  1. веб-пользователь открывает страницу для редактирования одного набора данных (строки)
  2. веб-пользователь нажимает кнопку «заблокировать», чтобы другие пользователи могли читать, но не писать этот набор данных
  3. веб-пользователь вносит некоторые изменения (возможно, от 1 до 30 минут)
  4. веб-пользователь нажимает «сохранить» или «отменить», и «блокировка» снимается

Существуют ли в php / mysql стандартные методы для этого сценария? Что произойдет, если веб-пользователь никогда не нажмет «сохранить» / «отменить», но закроет интернет-обозреватель?

Ответы [ 3 ]

10 голосов
/ 17 ноября 2011

Вам необходимо реализовать поля LOCKDATE и LOCKWHO в вашей таблице.Я сделал это во многих приложениях за пределами PHP / Mysql, и это всегда одинаково.

Блокировка прекращается после прохождения TTL, так что вы можете выполнить вычитание дат, используя NOW и LOCKDATE, чтобы увидеть,объект был заблокирован более чем на 30 минут или 1 час.

Другим фактором является рассмотрение того, является ли текущий пользователь блокирующим объект.Вот почему вам также нужен LOCKWHO.Это может быть user_id из вашей базы данных, session_id из PHP.Но держите его на том, что идентифицирует пользователя, ipaddress не является хорошим способом сделать это.

Наконец, всегда думайте о функции массовой разблокировки, которая просто сбрасывает все LOCKDATE и LOCKWHO ...

Приветствия

6 голосов
/ 11 сентября 2013

Я бы записал блокировки в одну централизованную таблицу вместо добавления полей во все таблицы.

Пример структуры таблицы:

tblLocks

  • TableName (имя заблокированной таблицы)
  • RowID (первичный ключ заблокированной строки таблицы)
  • LockDateTime (когда строка была заблокирована)
  • LockUser (кто заблокировал строку)

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

5 голосов
/ 17 ноября 2011

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

Функция блокировки такого типа заключается в том, что блокировка должна быть снята, и обстоятельства могут помешать этому произойти естественным образом (сбои системы, глупость пользователя, потеря сетевых пакетов и т. Д. И т. Д. И т. Д.). Вот почему вам нужно будет предоставить какой-нибудь метод ручной разблокировки и / или установить ограничение по времени (возможно, с помощью cron-задания?) На то, как долго можно заблокировать запись. Вы могли бы провести какой-то опрос AJAX, чтобы сохранить запись заблокированной, если браузер все еще открыт? В любом случае, вам, вероятно, было бы лучше убедиться, что данные в записи совпадают с данными, полученными при блокировке, прежде чем изменять их.

Это ограничение этого типа поведения особенно распространено в веб-приложениях, но справедливо для всего, что использует этот подход - Sage Line 50, например, является пагубным для него, мне регулярно приходится удалять файлы блокировки после машины / сбой приложения.

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