Я хочу реализовать функцию блокировки записи в приложении Yii2.
Если один пользователь открывает ссылку / запись обновления (пример http://localhost/myproject/backend/web/user/update/1
), то другой пользователь не сможет получить доступ к этой ссылке, и пользователь получит сообщение ALERT
котором говорится: « Эта запись уже открыта другим пользователем ". Таким образом, запись / страница должна блокироваться для другого пользователя. (Аналогично блокировке MS Excel)
Как только первый пользователь закончит и покинет эту запись / страницу, он должен разблокироваться, а другой пользователь может прочитать / обновить эти данные.
Итак, как я могу использовать механизм блокировки базы данных mysql здесь в активных записях Yii2 или есть ли другой способ реализовать это.
Любая помощь будет оценена по достоинству.
Это называется Оптимистическое блокирование и описано в официальных документах . Вот пример реализации:
// ------ view code ------- use yii\helpers\Html; // ...other input fields echo Html::activeHiddenInput($model, 'version'); // ------ controller code ------- use yii\db\StaleObjectException; public function actionUpdate($id) { $model = $this->findModel($id); try { if ($model->load(Yii::$app->request->post()) && $model->save()) { return $this->redirect(['view', 'id' => $model->id]); } else { return $this->render('update', [ 'model' => $model, ]); } } catch (StaleObjectException $e) { // logic to resolve the conflict } }
Вы можете добавить столбец locked_by_user в свою таблицу, и когда кто-то запрашивает действие обновления, вы проверяете столбец locked_by_user, если он установлен или нет. Если нет, установите его в user_id, который сначала запрашивает действие обновления . Также вам нужно беспокоиться о заблокированных замках . И рассмотрите случаи, когда пользователь просто может закрыть окно браузера, а затем запись будет заблокирована, пока он не предпримет какие-либо действия, такие как сохранение записи или отмену редактирования .