Maison >cadre php >PensezPHP >Présentation de l'utilisation et des exemples du verrou thinkphp

Présentation de l'utilisation et des exemples du verrou thinkphp

藏色散人
藏色散人avant
2021-05-12 17:15:334555parcourir

La colonne tutorielle suivante de thinkphp vous présentera l'utilisation et des exemples du verrouillage thinkphp. J'espère qu'elle sera utile aux amis dans le besoin !

Présentation de l'utilisation et des exemples du verrou thinkphp

Dans les exigences de développement, vous rencontrerez une telle situation, des demandes simultanées. Avant la fin de la mise à jour de la base de données, les données trouvées par une autre sélection seront les données avant la mise à jour, ce qui entraînera des données de requête inexactes.

Alors comment le résoudre ? Ce problème peut être résolu en utilisant les transactions et les verrous innoDB. Avant que la mise à jour de notre ligne actuelle ne soit terminée, les données de la requête de sélection pour cette ligne seront verrouillées.

Par exemple, notre base de données a deux lignes de données
Présentation de lutilisation et des exemples du verrou thinkphp
Nous mettons à jour les données numériques avec id=1 à 1000 et dormons pendant 10 secondes à ce moment-là, lorsque nous sélectionnons le. données avec id=1, il attendra la fin de la mise à jour. Si nous sélectionnons id=2, nous n'avons pas besoin d'attendre 10 secondes et les données seront obtenues immédiatement.
Il s'agit du verrouillage de ligne d'InnoDB. Il verrouillera uniquement la ligne de données actuellement mise à jour et ne verrouillera pas la table entière.
Le code de test sera répertorié ci-dessous. N'oubliez pas de changer le moteur en innoDB, pas en MYISAM.

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;

        }

    }
}

Étapes du test : après avoir demandé l'index, lors de la demande d'index2, vous verrez que index2 attendra que le chargement de l'index soit terminé avant de pouvoir voir le résultat de l'impression d'index2. Si l'identifiant de index2 est modifié en 2, il ne sera pas affecté par index.

Recommandations associées : Les 10 derniers didacticiels vidéo thinkphp

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Cet article est reproduit dans:. en cas de violation, veuillez contacter admin@php.cn Supprimer