首先我們了解一下數據庫的鎖,數據庫是一個多用戶使用的共享資源。當多個用戶並發地存取數據時,在數據庫中就會產生多個事務同時存取同一數據的情況。若對並發操作不加控制就可能會讀取和存儲不正確的數據,破壞數據庫的一致性,
(注意事項:首先,數據庫類型要是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'); }
InnoDB 預設是Row-Level Lock (行級鎖),FOR UPDATE 需要指定明確的主鍵才會行級鎖,否則為表級鎖,如:
select from user where id = 1 (行級鎖)
select from user where id > 1 (表級鎖)
操作完成后無需手動解鎖,會自動解鎖