Heim >PHP-Framework >Denken Sie an PHP >Einführung in die Verwendung und Beispiele der Thinkphp-Sperre
Die folgende Tutorial-Kolumne stellt Ihnen die Verwendung und Beispiele der Thinkphp-Sperre vor. Ich hoffe, dass sie Freunden, die sie benötigen, hilfreich sein wird!
Wie lässt sich das Problem lösen? Dieses Problem kann mithilfe von innoDB-Transaktionen und -Sperren gelöst werden. Bevor die Aktualisierung unserer aktuellen Zeile abgeschlossen ist, werden die Daten in der Auswahlabfrage für diese Zeile gesperrt.
Zum Beispiel hat unsere Datenbank zwei Datenzeilen wie diese
Wir aktualisieren die Anzahl der Daten mit der ID=1 auf 1000 und schlafen 10 Sekunden lang. Wenn wir zu diesem Zeitpunkt die Daten mit der ID=1 auswählen, werden wir dies tun Warten Sie, bis die Aktualisierung beendet ist. Wenn wir id =2 auswählen, müssen Sie nicht 10 Sekunden warten, die Daten werden sofort abgerufen. Dies ist die Zeilensperre von InnoDB. Sie sperrt nur die aktuell aktualisierte Datenzeile und nicht die gesamte Tabelle.
Der Testcode wird unten aufgeführt. Denken Sie daran, die Engine auf innoDB und nicht auf MYISAM zu ändern.
class Index extends Controller { public function index() { $model=Db::name('test'); $model->startTrans(); try{ $list=$model->lock(true)->find(); $model->where(['id'=>1])->data(['num'=>900])->update();//id为1的更新 sleep(10);//等待10秒 $model->commit(); print_r($list); }catch (\Exception $exception){ $model->rollback(); throw $exception; } } public function index2(){ $model=Db::name('test'); $model->startTrans(); try{ $list=$model->lock(true)->where(['id'=>1])->find();//id为1在更新时,select id=1 会等待。把ID改为2时,不等待 $model->commit(); print_r($list); }catch (\Exception $exception){ $model->rollback(); throw $exception; } } }
Die neuesten 10 Thinkphp-Video-Tutorials
Das obige ist der detaillierte Inhalt vonEinführung in die Verwendung und Beispiele der Thinkphp-Sperre. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!