Heim >PHP-Framework >Denken Sie an PHP >Einführung in die Verwendung und Beispiele der Thinkphp-Sperre

Einführung in die Verwendung und Beispiele der Thinkphp-Sperre

藏色散人
藏色散人nach vorne
2021-05-12 17:15:334604Durchsuche

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!

Einführung in die Verwendung und Beispiele der Thinkphp-Sperre

In Entwicklungsanforderungen werden Sie auf eine solche Situation stoßen, bei der gleichzeitige Anforderungen auftreten. Bevor die Datenbankaktualisierung abgeschlossen ist, handelt es sich bei den von einer anderen Auswahl gefundenen Daten um die Daten vor der Aktualisierung, was zu ungenauen Abfragedaten führt. 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.
Einführung in die Verwendung und Beispiele der Thinkphp-SperreDer 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;

        }

    }
}

Testschritte: Nachdem Sie den Index angefordert haben, sehen Sie beim Anfordern von Index2, dass Index2 auf den Abschluss des Ladens des Index wartet, bevor wir das Druckergebnis von Index2 sehen können. Wenn die ID von Index2 auf 2 geändert wird, hat der Index keine Auswirkungen darauf.

Verwandte Empfehlungen:

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!

Stellungnahme:
Dieser Artikel ist reproduziert unter:csdn.net. Bei Verstößen wenden Sie sich bitte an admin@php.cn löschen