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