如何在Yii2中实现mysql记录锁定

J.K*_*.A. 6 php mysql locking yii2

我想在我的Yii2应用程序中实现记录锁定功能.

如果一个用户打开更新链接/记录(例如http://localhost/myproject/backend/web/user/update/1),则另一个用户无法访问此链接,用户将收到一条ALERT消息" 此记录已由另一个用户打开 ".所以记录/页面应锁定另一个用户.(与MS Excel锁定相同)

一旦第一个用户完成并离开该记录/页面,它就应该解锁,另一个用户可以读取/更新该数据.

那么如何在Yii2活动记录中使用mysql数据库锁定机制,还是有其他方法来实现它.

任何帮助,将不胜感激.

aro*_*hev 7

它被称为乐观锁定,并在官方文档中进行了描述.以下是一个实施示例:

// ------ 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
    }
}
Run Code Online (Sandbox Code Playgroud)


Ton*_*ony 1

您可以将locked_by_user列添加到表中,当有人请求更新操作时,您检查locked_by_user列是否已设置。如果没有,则设置为最先请求更新操作的user_id 。您还需要关注重置锁的问题。并考虑用户只能关闭浏览器窗口,然后记录将被锁定,直到他做出任何操作(例如保存记录取消编辑)的情况。