Я создаю платформу, которая должна обслуживать многих корпоративных пользователей одновременно. Система содержит много записей, которые время от времени требуют обновления. Важно, чтобы каждое изменение регистрировалось и надлежащим образом сохранялось. Я использую реализацию Laravel 6 для серверной части и Angular 6 для клиентской части. Внешний интерфейс отправляет запросы к внутреннему через HTTP-запросы. Данные хранятся в базе данных MySQL.
Пользователи загружают определенный набор данных либо в режиме только для чтения, либо в режиме чтения-записи. В режиме только для чтения нет необходимости блокировать ресурс, так как пользователь знает, что он может только читать данные. В режиме чтения-записи набор данных должен быть заблокирован с того момента, когда пользователь запросил данные, так что набор данных не может быть запрошен другим пользователем, пока кто-то работает с данными. Пользователь, работающий с данными, затем открывает данные в веб-форме для редактирования. Как только пользователь сохранит, отменит или закроет браузер, данные должны быть разблокированы.
Теперь блокировка данных в базе данных не проблема, я держу таблицу, наборы данных которой заблокированы для редактирования и всякий раз, когдапользователь пытается получить доступ к этим данным, выдается ошибка. Кроме того, выпуск данных, когда пользователь либо сохраняет отмены, не является проблемой, я просто снимаю блокировку в таблице.
Однако, поскольку при редактировании браузера не происходит взаимодействия с браузером при редактировании. набор данных остается заблокированным на неопределенный срок (я мог бы исправить это с помощью временных меток, cronjobs и т. д., но это не вариант для инфраструктуры компании). Мне интересно, как это исправить?
Одна идея, которая у меня возникла, но я не представляю, как это реализовать, заключается в том, чтобы поддерживать HTTP-соединение открытым между клиентом и сервером и иметь сервер (laravel). выполнить некоторый код, чтобы снять блокировки, когда соединение закрыто. Любые советы, подсказки или указатели для меня, чтобы продолжить отсюда?