上面的代码对比乐观锁,主要不同点在于:
-
新增加了一个加锁方法,一个获取锁定最大时长的方法。
保存时不再是把标识字段+1,而是把标识字段置0。
在具体使用方法上,可以参照以下代码:
// 从PLockAR派生模型类
class Post extends PLockAR {
// 重载定义悲观锁标识字段,如 locked_at
public function pesstimisticLock() {
return 'locked_at';
}
// 重载定义最大锁定时长,如1小时
public function maxLockTime() {
return 3600000;
}
}
// 修改前要尝试加锁
class SectionController extends Controller {
public function actionUpdate($id)
{
$model = $this->findModel($id);
if ($model->load(Yii::$app->request->post()) && $model->save()) {
return $this->redirect(['view', 'id' => $model->id]);
} else {
// 加入一个加锁的判断
if (!$model->lock()) {
// 加锁失败
// ... ...
}
return $this->render('update', [
'model' => $model,
]);
}
}
}
上述方法实现的悲观锁,避免了使用数据库自身的锁机制,契合Web应用的特点, 具有一定的适用性,但是也存在一定的缺陷:
-
最长允许锁定时长会带来一定的副作用。时间定得长了,可能要等很长时间, 才能重新编辑非正常解锁的记录。时间定得短了,则经常退化成乐观锁。
时间戳精度问题。如果精度不够,那么在加锁时,与我们讨论过的乐观锁失效存, 在同样的漏洞。
这种形式的锁定,只是应用层面的锁定,并非数据库层面的锁定。 如果存在应用之外对于数据库的写入操作。这个锁定机制是无效的。
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持易采站长站。







