當我們遇到存在高並發並且對於數據的准確性有要求的場景,需要了解和使用for update
需要注意的點:
1、InnoDB默認是行級別的鎖,當有明確指定的主鍵時候,是行級鎖。否則是表級別
2、for update 僅適用於InnoDB,並且必選開啟事務, 在begin與commit之間才生效
public function actionTest(){ $db = Yii::$app->db; $transaction = $db->beginTransaction(); try{ $sql = "select * from ".User::tableName()." where user_id=5 for update"; $userInfo = User::findBySql($sql)->one(); $userInfo->nickname= 'asfasdfasfdaf'; $userInfo->save(); $transaction->commit(); $this->success(); }catch (ServiceException $e){ $transaction->rollBack(); $this->error(); } }