Как заблокировать ресурсы MySQL, когда они открыты в веб-форме, и разблокировать при закрытии / завершении редактирования - PullRequest
1 голос
/ 10 октября 2019

Я создаю платформу, которая должна обслуживать многих корпоративных пользователей одновременно. Система содержит много записей, которые время от времени требуют обновления. Важно, чтобы каждое изменение регистрировалось и надлежащим образом сохранялось. Я использую реализацию Laravel 6 для серверной части и Angular 6 для клиентской части. Внешний интерфейс отправляет запросы к внутреннему через HTTP-запросы. Данные хранятся в базе данных MySQL.

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

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

Однако, поскольку при редактировании браузера не происходит взаимодействия с браузером при редактировании. набор данных остается заблокированным на неопределенный срок (я мог бы исправить это с помощью временных меток, cronjobs и т. д., но это не вариант для инфраструктуры компании). Мне интересно, как это исправить?

Одна идея, которая у меня возникла, но я не представляю, как это реализовать, заключается в том, чтобы поддерживать HTTP-соединение открытым между клиентом и сервером и иметь сервер (laravel). выполнить некоторый код, чтобы снять блокировки, когда соединение закрыто. Любые советы, подсказки или указатели для меня, чтобы продолжить отсюда?

1 Ответ

2 голосов
/ 10 октября 2019

Используйте поле метки времени без задания cron, чтобы указать, как долго запись заблокирована. Если текущее время позже, чем отметка времени, считайте запись разблокированной.

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

Если пользователь закроет окно браузера, поле метки времени не будет обновлено, и запись будет разблокирована через пару минут.

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