блокировка базы данных symfony во время сеанса

#php #symfony #session #doctrine #locking

#php #symfony #сеанс #доктрина #блокировка

Вопрос:

Я пытаюсь создать систему на основе php для нескольких пользователей. Я использую Symfony2 в качестве фреймворка. Данные хранятся в базе данных MySQL.

Чтобы позволить разным пользователям одновременно работать с системой, я хочу заблокировать записи базы данных. Насколько я знаю, doctrine поддерживает оптимистическую и пессимистическую блокировку. Моя идея заключалась в том, чтобы заблокировать запись (соответственно, весь объект или строку) пессимистично, когда пользователь открывает сайт для редактирования этой записи. Он должен оставаться заблокированным, пока он не закончит его редактирование или не прервет его… и так, пока он не перейдет на другой сайт.

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

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

С наилучшими пожеланиями SpiGAndromeda

Комментарии:

1. Я не думаю, что пошел бы по этому пути, это звучит болезненно и может вызвать проблемы. Почему бы не использовать внешнее хранилище ключей общих данных, например memcache или что-то в этом роде, чтобы заблокировать идентификатор записи каким-либо ключом / пользователем во время редактирования записи? Затем, если кто-то попытается получить доступ к этому документу, пока другой пользователь редактирует, если вы можете отобразить, что он заблокирован. Таким образом, вы потенциально не блокируете свою базу данных. Вы можете обновить блокировку с помощью какого-либо ajax или аналогичного (и дать ему разумный тайм-аут на случай, если пользователь перейдет в AFK и т. Д.). Просто мысль об альтернативном подходе.

2. ОК. Надеюсь, я правильно понимаю… Я должен использовать memchache для хранения идентификатора редактируемой записи (с определенным сроком действия). И каждый раз, когда кто-то открывает страницу редактирования, я проверяю, существует ли ключ этой записи в memchache?

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