Table des matières
1. Verrouillage de la table MyISAM
%%PRE_BLOCK_0%%
Maison développement back-end tutoriel php Une brève analyse du fonctionnement simple du mécanisme de verrouillage MySQL par PHP

Une brève analyse du fonctionnement simple du mécanisme de verrouillage MySQL par PHP

Apr 30, 2021 pm 05:16 PM
Mécanisme de verrouillage MySQL php

Une brève analyse du fonctionnement simple du mécanisme de verrouillage MySQL par PHP

Mécanisme de verrouillage
Verrouillage partagé et verrouillage exclusif
Verrouillage partagé (verrouillage en lecture) : les autres transactions peuvent lire, mais ne peuvent pas écrire.
Verrouillage exclusif (verrouillage en écriture) : les autres transactions ne peuvent ni lire ni écrire.

Pour MySQL, il existe trois niveaux de verrouillage : niveau page, niveau table, niveau ligne

  • Le moteur représentatif typique du niveau page est BDB.
  • Un moteur typique au niveau des lignes est INNODB.
  • Les moteurs représentatifs typiques au niveau de la table sont MyISAM, MEMORY et l'ISAM d'il y a longtemps.
  • Le moteur de stockage BDB utilise le verrouillage au niveau de la page, mais prend également en charge les verrous au niveau de la table
  • Le moteur de stockage InnoDB prend en charge à la fois le verrouillage au niveau de la ligne (verrouillage au niveau de la ligne) et le verrouillage au niveau de la table. des verrous au niveau de la ligne, mais les verrous au niveau de la ligne sont utilisés par défaut.
  • Les moteurs de stockage MyISAM et MEMORY utilisent des verrous au niveau des tables

Recommandations d'apprentissage gratuites associées : programmation php(vidéo)

1. Verrouillage de la table MyISAM

Mode de verrouillage au niveau de la table MyISAM :

  • Verrouillage en lecture partagé de la table (Table Read Lock) : Non Il bloquera les demandes de lecture des autres utilisateurs sur la même table, mais il bloquera les demandes d'écriture sur la même table
  • Verrouillage d'écriture de la table : il bloquera les opérations de lecture et d'écriture des autres utilisateurs sur la même table ; 🎜>
Méthode de verrouillage de la table MyISAM :

    Utilisez la commande LOCK TABLE pour verrouiller explicitement la table MyISAM
  • LOCK TABLES real_table (READ|WRITE), insert_table ( READ|WRITE); //Lock
  • UNLOCK TABLES; //Unlock
Exemple :

Par exemple, il y a un compte (id, nom ,cash), héros (numéro, nom, pays) ces deux tables

    verrouiller les tables compte lu ; Ajouter un compte comme verrou en lecture seule
  1. Requête de processus actuelle : sélectionner * à partir du héros ; La table de rapport 'hero' n'a pas été verrouillée avec LOCK TABLES.
    Le processus actuel modifie les autres tables : mettre à jour le nom du jeu de héros = "ss" où numéro = 1 ; signalera que la table 'héros" n'a pas été verrouillée avec LOCK TABLES
    Le processus actuel modifie le nom de la table : mettre à jour le nom du jeu de comptes = "ssss" où id=1 ; il signalera que la table 'compte' a été verrouillée avec un verrou READ et ne peut pas être mise à jour
    Si un autre processus MySQL arrive, vous pouvez interroger d'autres tables et comptes, mais vous ne pouvez pas modifier le compte, et vous continuerez d'attendre et devrez être libéré. ​​Le verrou est exécuté
Opération 1.1PHP

<?php/**
 * Created by PhpStorm.
 * User: Administrator
 * Date: 2021/4/29 0029
 * Time: 11:20
 */$link = new mysqli(&#39;127.0.0.1&#39;, &#39;root&#39;, &#39;123&#39;, &#39;db_school&#39;); // 连接数据库if(mysqli_connect_errno()){                                // 检查连接错误
    printf("连接失败:%s<br>", mysqli_connect_error());
    exit();}//(s1)$table = "account";$type = "read";$sql1 = "LOCK TABLES $table $type";$link->query($sql1);//处理逻辑//$sql1 = "select * from $table;";        //(s1)true//$sql1 = "select * from hero;";        //false//$sql1 = "update hero set name='ss' where number=1; ";     //false$sql1 = "update account set name='ssss' where id=1;";   //false$result = $link->query($sql1);var_dump($result);sleep(20);  //测试    //假设还没释放锁,开启cmd进mysql(s2)可以查询,但不能执行更改和删除操作,会等待这边释放锁$link->query("unlock tables");    //取消全部的锁//解锁后正常操作//$result = $link -> query($sql1);//var_dump($result);$link->close();

Confliction de verrouillage au niveau de la table de requête

afficher le statut comme 'Table%';

    Table_locks_immediate fait référence au nombre de fois où des verrous au niveau de la table peuvent être obtenus immédiatement
  • Table_locks_waited fait référence au nombre de fois où des verrous au niveau de la table les verrous ne peuvent pas être obtenus immédiatement et doivent attendre
2. Méthode de verrouillage InnoDB :

Pour les instructions SELECT ordinaires, InnoDB n'ajoutera aucun verrou Le verrouillage ne peut être utilisé que pendant l'exécution de la transaction

Les verrous ne peuvent être utilisés que pendant l'exécution de la transaction. Ils ne seront libérés que lorsque la validation ou la restauration sera exécutée, et tous les verrous seront libérés en même temps.

Verrou(s) partagé(s) : SELECT * FROM nom_table OÙ… VERROUILLER EN MODE PARTAGE. D'autres sessions peuvent toujours interroger l'enregistrement et ajouter des verrous partagés en mode partage à l'enregistrement. Cependant, si la transaction en cours doit mettre à jour l'enregistrement, cela risque de provoquer un blocage. Tout le monde peut le lire, mais il ne peut pas le modifier. Il ne peut être modifié que lorsque l'un des verrous partagés exclusifs est verrouillé
  • Verrou exclusif (X) : SELECT * FROM table_name WHERE ... FOR UPDATE ; Les autres sessions peuvent interroger l'enregistrement, mais ne peuvent pas ajouter de verrous partagés ou exclusifs à l'enregistrement, mais attendent d'obtenir le verrou. Je veux le changer, mais vous ne pouvez pas le changer ni le lire
  • #select … verrouiller en mode partage //Verrouillage partagé
  • #select … pour la mise à jour //Verrouillage exclusif
    ##Dans MySQL 8.0

    Verrou partagé (S) : SELECT * FROM nom_table WHERE … FOR SHARE
  • Verrou exclusif (X) : SELECT * FROM nom_table WHERE … FOR UPDATE[NOWAIT|SKIP LOCKED]
  • – NOWAIT : Découverte Après avoir attendu un verrou, une erreur sera immédiatement renvoyée. Il n'est pas nécessaire d'attendre que le verrou expire et signale une erreur.
  • –SKIP LOCKED : ignorez les lignes verrouillées et mettez directement à jour les autres lignes, mais veillez à ce que les résultats de la mise à jour ne répondent pas aux attentes.

Opération PHP 2.1
<?php/**
 * Created by PhpStorm.
 * User: Administrator
 * Date: 2021/4/29 0029
 * Time: 10:06
 */$link = new mysqli(&#39;127.0.0.1&#39;, &#39;root&#39;, &#39;123&#39;, &#39;db_school&#39;); // 连接数据库if(mysqli_connect_errno()){                                // 检查连接错误
    printf("连接失败:%s<br>", mysqli_connect_error());
    exit();}//案例1$id = 1; //明确指定主键,并且有此数据,row lock (行锁)//$id = -1;   //明确指定主键,若查无此数据,无lock (无锁)$link->autocommit(0);                   // 开始事务(s1)//FOR UPDATE仅适用于InnoDB,且必须在交易区块(BEGIN/COMMIT)中才能生效。$sql = "select * from account where id=$id for update";$link->query($sql);/***
 * 此时其他mysql进程可以查询该记录,但是不能对该记录加共享锁或排他锁,而是等待获得锁。
 *///(s1)可以进行更改,和查询等操作//$sql1 = "update account set name='aaa' where id=$id;";  //进行更改//$sql1 = "select * from account where id=$id;";  //进行查询$sql1 = "delete from account where id=$id;";  //进行删除$result = $link -> query($sql1);var_dump($result);sleep(20); //测试    //假设还在事务处理中,开启cmd进mysql(s2)执行更改和删除操作,会等待这边释放锁$link->commit();$link->close();

Afficher les tables verrouillées
afficher les TABLES OUVERTES où In_use > en cours d'exécution.


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 de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn

Outils d'IA chauds

Undress AI Tool

Undress AI Tool

Images de déshabillage gratuites

Undresser.AI Undress

Undresser.AI Undress

Application basée sur l'IA pour créer des photos de nu réalistes

AI Clothes Remover

AI Clothes Remover

Outil d'IA en ligne pour supprimer les vêtements des photos.

Clothoff.io

Clothoff.io

Dissolvant de vêtements AI

Video Face Swap

Video Face Swap

Échangez les visages dans n'importe quelle vidéo sans effort grâce à notre outil d'échange de visage AI entièrement gratuit !

Outils chauds

Bloc-notes++7.3.1

Bloc-notes++7.3.1

Éditeur de code facile à utiliser et gratuit

SublimeText3 version chinoise

SublimeText3 version chinoise

Version chinoise, très simple à utiliser

Envoyer Studio 13.0.1

Envoyer Studio 13.0.1

Puissant environnement de développement intégré PHP

Dreamweaver CS6

Dreamweaver CS6

Outils de développement Web visuel

SublimeText3 version Mac

SublimeText3 version Mac

Logiciel d'édition de code au niveau de Dieu (SublimeText3)

Sujets chauds

Tutoriel PHP
1594
276
La visionneuse PDF Edge ne fonctionne pas La visionneuse PDF Edge ne fonctionne pas Aug 07, 2025 pm 04:36 PM

TestThepdfinanotherApptodetermineIftheissueiswiththefileoredge.2.EnBlEthebuilt-inpdfViewerByTurningOff "AlwaysOpenpdffilesexternal" et "DownloadPdffiles" inedgestoSolver.

Développeur YII: maîtriser les compétences techniques essentielles Développeur YII: maîtriser les compétences techniques essentielles Aug 04, 2025 pm 04:54 PM

Pour devenir un maître de YII, vous devez maîtriser les compétences suivantes: 1) Comprendre l'architecture MVC de YII, 2) Compartif dans l'utilisation activerecordorm, 3) utilisez efficacement les outils de génération de code GII, 4) les règles de vérification de Master YII, 5) Optimiser les performances de la base de données, 6) prêtent en continu l'attention aux écosystèmes de la base de données. Grâce à l'apprentissage et à la pratique de ces compétences, les capacités de développement dans le cadre YII peuvent être améliorées de manière globale.

VS CODE Raccourci pour se concentrer sur le panneau Explorer VS CODE Raccourci pour se concentrer sur le panneau Explorer Aug 08, 2025 am 04:00 AM

Dans VSCODE, vous pouvez rapidement changer le panneau et la zone d'édition via des touches de raccourci. Pour sauter vers le panneau d'explorateur gauche, utilisez Ctrl Shift E (Windows / Linux) ou CMD Shift E (Mac); Retournez dans la zone d'édition pour utiliser Ctrl `ou ESC ou Ctrl 1 ~ 9. Par rapport au fonctionnement de la souris, les raccourcis clavier sont plus efficaces et n'interrompent pas le rythme de codage. Les autres conseils incluent: Ctrl KCTRL E FOCUS RECHERCH BOX, F2 Renommer Fichier, Supprimer le fichier, Entrez le fichier ouvert, le dossier de la touche Arrow Extend / Effondrement.

passer par l'exemple exécutant un sous-processus passer par l'exemple exécutant un sous-processus Aug 06, 2025 am 09:05 AM

Exécutez le processus enfant à l'aide du package OS / EXEC, créez la commande via exec.command mais ne l'exécutez pas immédiatement; 2. Exécutez la commande avec .output () et attrapez stdout. Si le code de sortie est non nul, return exec.exiterror; 3. Utilisez .Start () Pour démarrer le processus sans blocage, combinez avec .StoutPipe () pour diffuser la sortie en temps réel; 4. Entrez les données dans le processus via .stDinpipe (), et après avoir écrit, vous devez fermer le pipeline et appeler .wait () pour attendre la fin; 5. exec.exiterror doit être traité pour obtenir le code de sortie et le stderr de la commande raté pour éviter les processus zombies.

Correction: la mise à jour Windows n'a pas réussi à installer Correction: la mise à jour Windows n'a pas réussi à installer Aug 08, 2025 pm 04:16 PM

RunThewindowsUpDateTroulesshooTervAyingSettings> Update & Security> TroubleshoottoAutomAticyFixComMonissues.2.ResetwindowsupDateComponentsBystoppingrelatedServices, RenamingtheSoftwaredSistributeandCatroot2folders, TherestartingTheServicestoClelele

Comment travailler avec des tableaux en php Comment travailler avec des tableaux en php Aug 20, 2025 pm 07:01 PM

Phparrayshandledatacollectionsefficantyusing indexedorassociativstructures; theyareCreated withArray () ou [], accessedViakeys, modifiedByAssigment, itérated withoreach, andmanipulatedUsingFunction

Correction: Ethernet 'réseau non identifié' Correction: Ethernet 'réseau non identifié' Aug 12, 2025 pm 01:53 PM

RestartyourRouterAndComputerToresolvetemporaryGlithes.2.RunthenetWorkTrouleshooTerviATheSystemTraytomAticalMatterFixComMonissues.3.RenewtheipAddressusingcomandPomptSADMinistratorByrunningIpConfig / Release, Ipconfig / Renew, NetShwinsockReset, etnetSh

Maîtriser le contrôle du flux dans Forach en utilisant la pause, continuer et goto Maîtriser le contrôle du flux dans Forach en utilisant la pause, continuer et goto Aug 06, 2025 pm 02:14 PM

BreakexitsTheroop impectument après le financement de la finale, IdealForstoppingatTtheFirstmatch.2

See all articles