Heim > Artikel > Backend-Entwicklung > 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
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.
- 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 Exclusive Write Lock (Tabellenschreibsperre); : Es blockiert die Lese- und Schreibvorgänge anderer Benutzer für dieselbe Tabelle.Verwenden Sie den Befehl LOCK TABLE, um die MyISAM-Tabelle explizit zu sperren. LOCK TABLES real_table ( READ|WRITE), insert_table (READ|WRITE); / /Lock
Bei gewöhnlichen SELECT-Anweisungen fügt InnoDB keine Sperren hinzu alle Sperren;UNLOCK TABLES; //Unlock
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
- Beispiel:
Zum Beispiel gibt es zwei Tabellen: Konto (ID, Name, Bargeld), Held (Nummer). , Name, Land).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:
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.–SKIP LOCKED: Überspringen Sie gesperrte Zeilen und aktualisieren Sie andere Zeilen direkt. Seien Sie jedoch vorsichtig, ob die Aktualisierungsergebnisse nicht den Erwartungen entsprechen.
- 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.
–NOWAIT: Ein Fehler wird sofort zurückgegeben, nachdem eine wartende Sperre gefunden wurde, ohne zu warten damit die Sperre abläuft.
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.1PHP-Vorgang<?php/** * Created by PhpStorm. * User: Administrator * Date: 2021/4/29 0029 * Time: 11:20 */$link = new mysqli('127.0.0.1', 'root', '123', 'db_school'); // 连接数据库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();
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!