Eine kurze Analyse der einfachen Funktionsweise des MySQL-Sperrmechanismus durch PHP

coldplay.xixi
Freigeben: 2023-04-09 22:42:01
nach vorne
8143 Leute haben es durchsucht

Eine kurze Analyse der einfachen Funktionsweise des MySQL-Sperrmechanismus durch PHP

Sperrmechanismus
Gemeinsame Sperre und exklusive Sperre
Gemeinsame Sperre (Lesesperre): Andere Transaktionen können lesen, aber nicht schreiben.
Exklusive Sperre (Schreibsperre): Andere Transaktionen können weder lesen noch schreiben.

Für MySQL gibt es drei Sperrebenen: Seitenebene, Tabellenebene, Zeilenebene

  • Die typische repräsentative Engine der Seitenebene ist BDB.
  • Die typische repräsentative Engine auf Zeilenebene ist INNODB.
  • Typische repräsentative Engines auf Tabellenebene sind MyISAM, MEMORY und das alte ISAM.
  • BDB-Speicher-Engine verwendet Sperren auf Seitenebene, unterstützt aber auch Sperren auf Tabellenebene.
  • InnoDB-Speicher-Engine unterstützt sowohl Sperren auf Zeilenebene (Sperren auf Zeilenebene) als auch Sperren auf Tabellenebene, standardmäßig wird jedoch Sperren auf Zeilenebene verwendet .
  • MyISAM- und MEMORY-Speicher-Engines verwenden Sperren auf Tabellenebene. Verwandte kostenlose Lernempfehlungen:
  • PHP-Programmierung
Table Shared Read Lock (Tabellenlesesperre): Es blockiert nicht die Leseanforderungen anderer Benutzer für dieselbe Tabelle, blockiert jedoch die Schreibanforderungen anderer Benutzer für dieselbe Tabelle.
Table Exclusive Write Lock (Tabellenschreibsperre); : Es blockiert die Lese- und Schreibvorgänge anderer Benutzer für dieselbe Tabelle.

MyISAM-Tabellensperrmethode:

Verwenden Sie den Befehl LOCK TABLE, um die MyISAM-Tabelle explizit zu sperren.

LOCK TABLES real_table ( READ|WRITE), insert_table (READ|WRITE); / /Lock

UNLOCK TABLES; //Unlock

  • Beispiel:
  • Zum Beispiel gibt es zwei Tabellen: Konto (ID, Name, Bargeld), Held (Nummer). , Name, Land).
Der aktuelle Prozess ändert andere Tabellen: update hero set name="ss" where number=1; wird melden, dass Tabelle „hero“ nicht mit LOCK TABLES gesperrt wurde

Der aktuelle Prozess ändert die Tabelle: update account set name="ssss" where id=1 ; meldet, dass die Tabelle „Konto“ mit einer READ-Sperre gesperrt wurde und nicht aktualisiert werden kann.

Wenn ein anderer MySQL-Prozess eintrifft, können Sie andere Tabellen und Konten abfragen, aber Sie können das Konto nicht ändern. Es wird ewig warten und die Sperre muss vor der Ausführung aufgehoben werden sofort erhalten werden
  • Table_locks_waited bezieht sich auf Sperren auf Tabellenebene, die nicht sofort erhalten werden können. Die Häufigkeit, mit der Sie auf eine Sperre warten müssen
  • 2. InnoDB-Sperrmethode:
Bei gewöhnlichen SELECT-Anweisungen fügt InnoDB keine Sperren hinzu alle Sperren;
Sperren können nur während der Transaktionsausführung verwendet werden


Die Sperren können nur während der Festschreibungsausführung verwendet werden. Oder sie werden beim Zurücksetzen freigegeben, und alle Sperren werden gleichzeitig freigegeben.

  1. Gemeinsame Sperre(n): SELECT * FROM table_name WHERE … LOCK IN SHARE MODE. Andere Sitzungen können den Datensatz weiterhin abfragen und dem Datensatz gemeinsame Sperren im Freigabemodus hinzufügen. Wenn die aktuelle Transaktion jedoch den Datensatz aktualisieren muss, führt dies wahrscheinlich zu einem Deadlock. Jeder kann es lesen, aber es kann nicht geändert werden, wenn eine der exklusiven gemeinsamen Sperren gesperrt ist.

    Exklusive Sperre (X): SELECT * FROM table_name WHERE ... FOR UPDATE. Andere Sitzungen können den Datensatz abfragen, dem Datensatz jedoch keine gemeinsame Sperre oder exklusive Sperre hinzufügen, sondern auf den Erhalt der Sperre warten. Ich möchte es ändern, aber Sie können es nicht ändern oder lesen ): SELECT * FROM table_name WHERE … FOR SHARE

    Exklusive Sperre (X): SELECT * FROM table_name WHERE … FOR UPDATE[NOWAIT|SKIP LOCKED]
  2. –NOWAIT: Ein Fehler wird sofort zurückgegeben, nachdem eine wartende Sperre gefunden wurde, ohne zu warten damit die Sperre abläuft.
–SKIP LOCKED: Überspringen Sie gesperrte Zeilen und aktualisieren Sie andere Zeilen direkt. Seien Sie jedoch vorsichtig, ob die Aktualisierungsergebnisse nicht den Erwartungen entsprechen.

2.1PHP-Vorgang

<?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();
Nach dem Login kopieren

Sehen Sie sich die Tabellen an, die gesperrt sind.
    show OPEN TABLES where In_use >

Das obige ist der detaillierte Inhalt vonEine kurze Analyse der einfachen Funktionsweise des MySQL-Sperrmechanismus durch PHP. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Verwandte Etiketten:
Quelle:csdn.net
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage
Über uns Haftungsausschluss Sitemap
Chinesische PHP-Website:Online-PHP-Schulung für das Gemeinwohl,Helfen Sie PHP-Lernenden, sich schnell weiterzuentwickeln!