php mysql locking yii2

php - Cómo implementar el bloqueo de registros mysql en Yii2



locking (2)

Puede agregar la columna locked_by_user a su tabla y cuando alguien solicita una acción de actualización , comprueba la columna locked_by_user si está configurada o no. De lo contrario, configúrelo en el user_id que primero solicita la acción de actualización . También debe preocuparse por restablecer los bloqueos . Y considere los casos en que el usuario solo cierre la ventana del navegador y luego la grabación se bloqueará hasta que realice cualquier acción, como guardar registro o cancelar la edición .

Quiero implementar la funcionalidad de bloqueo de registros en mi aplicación Yii2.

Si un usuario abre el enlace / registro de actualización (Ej. http://localhost/myproject/backend/web/user/update/1 ), entonces otro usuario no podrá acceder a este enlace y el usuario recibirá un mensaje de ALERT que dice " Este registro ya está abierto" por otro usuario ". Entonces la grabación / página debe bloquearse para otro usuario. (Igual que el bloqueo de MS Excel)

Una vez que el primer usuario finaliza y sale de ese registro / página, debe desbloquearse y otro usuario puede leer / actualizar esa información.

Entonces, ¿cómo puedo usar el mecanismo de bloqueo de la base de datos mysql aquí en los registros activos Yii2 o hay alguna otra forma de implementar esto?

Cualquier ayuda sería apreciada.


Se llama bloqueo optimista y se describe en documentos oficiales . Aquí hay un ejemplo de implementación:

// ------ 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 } }