首先我們瞭解一下數據庫的鎖,數據庫是一個多用戶使用的共享資源。當多個用戶併發地存取數據時,在數據庫中就會產生多個事務同時存取同一數據的情況。若對併發操作不加控制就可能會讀取和存儲不正確的數據,破壞數據庫的一致性,(注意事項:首先,數據庫類型要是InnoDB,其次,加鎖必須跟事務同時使用)。
在tp5中如何使用:請看以下代碼
public function testTrans(){
$time = date('H:i:s');
$model = new \app\model\Student();
$model->startTrans();//開啓事務
try{
$student = $model->lock(true)->where('id', 4)->find();//加鎖
$student->update(['age' => $student['age']+10], ['id' => 4]);
sleep(20);
$model->commit();//事務提交
return $time.'_lock_true_'.date('H:i:s');
} catch (\Exception $e) {
$model->rollback();
throw $e;
}
return $time.'_lock_false_'.date('H:i:s');
}
當我們在瀏覽器中先運行該方法,立即再打開窗口在運行一次,我們看一下結果如下圖
我們發現第二次會在一次運行完之後,也就是在等待20s,事務提交後纔會進行操作