InnoDB unterstützt Transaktionen, Zeilensperren und Tabellensperren. MyISAM unterstützt keine Transaktionen und unterstützt nur Tabellensperren. Hier wird nur InnoDB vorgestellt.
InnoDB implementiert die folgenden zwei Arten von Zeilensperren.
Gemeinsame Sperre (S): ermöglicht einer Transaktion das Lesen einer Zeile und verhindert, dass andere Transaktionen eine exklusive Sperre für denselben Datensatz erhalten.
Exklusive Sperre (X): Ermöglicht einer Transaktion, die eine exklusive Sperre erhält, das Aktualisieren von Daten und verhindert, dass andere Transaktionen gemeinsame Lesesperren und exklusive Schreibsperren für denselben Datensatz erhalten.
Um die Koexistenz von Zeilensperren und Tabellensperren zu ermöglichen und einen Sperrmechanismus mit mehreren Granularitäten zu implementieren, verfügt InnoDB außerdem über zwei intern verwendete Absichtssperren (Intention Locks Both Intention). Sperren sind Es ist eine Tabellensperre.
Intention shared lock (IS): Die Transaktion beabsichtigt, der Datenzeile eine gemeinsame Sperre hinzuzufügen. Die Transaktion muss zuerst die IS-Sperre der Tabelle erhalten, bevor sie eine gemeinsame Sperre hinzufügt eine Datenzeile.
Intention exklusive Sperre (IX): Die Transaktion beabsichtigt, der Datenzeile eine zeilenexklusive Sperre hinzuzufügen. Die Transaktion muss zuerst die IX-Sperre der Tabelle erhalten, bevor sie eine exklusive Sperre hinzufügt eine Datenzeile.
Kompatibilitätsliste für den InnoDB-Zeilensperrmodus
请求锁模式
是否兼容
当前锁模式
|
X |
IX |
S |
IS |
X |
冲突 |
冲突 |
冲突 |
冲突 |
IX |
冲突 |
兼容 |
冲突 |
兼容 |
S |
冲突 |
冲突 |
兼容 |
兼容 |
IS |
冲突 |
兼容 |
兼容 |
兼容 |
Sperrmodus anfordern Ist es kompatibel
- Aktueller Sperrmodus
X |
IX |
S |
IS |
|
X |
Konflikt |
Konflikt |
Konflikt | Konflikt |
IX |
Konflikt |
Kompatibel |
Konflikt |
Kompatibel |
S |
Konflikt |
Konflikt |
Kompatibel |
Kompatibel |
IS |
Konflikt |
Kompatibel |
Kompatibel |
Kompatibel |
Wenn der von einer Transaktion angeforderte Sperrmodus mit der aktuellen Sperre kompatibel ist, gewährt InnoDB der Transaktion die angeforderte Sperre, andernfalls, wenn die beiden nicht kompatibel sind Die Transaktion wird warten, bis die Sperre aufgehoben wird. Hinweis:
Absichtssperre wird automatisch von InnoDB hinzugefügt und erfordert keinen Benutzereingriff.
Für UPDATE-, DELETE- und INSERT-Anweisungen fügt InnoDB dem betroffenen Datensatz automatisch eine exklusive Sperre (X) hinzu.
Für gewöhnliche SELECT-Anweisungen fügt InnoDB keine Sperren hinzu.
-
InnoDB-Zeilensperre wird durch Sperren der Indexelemente im Index implementiert. Daher bedeutet die Zeilensperr-Implementierungsfunktion von InnoDB, dass InnoDB nur die Indexbedingung zum Abrufen von Daten verwendet Sperren, andernfalls verwendet InnoDB Tabellensperren.
-
Darüber hinaus können Transaktionen durch die folgenden Anweisungen explizit gemeinsame Sperren oder exklusive Sperren zum Recordset hinzufügen.
Gemeinsame Sperre(n): SELECT * FROM table_name WHERE ... LOCK IN SHARE MODE.
Exklusive Sperre (X): SELECT * FROM table_name WHERE ... FOR UPDATE.
Verwenden Sie SELECT ... IN SHARE MODE, um eine gemeinsame Sperre zu erhalten, die hauptsächlich zur Bestätigung verwendet wird, ob eine Datensatzzeile bei Datenabhängigkeiten vorhanden ist sind erforderlich, und stellen Sie sicher, dass niemand UPDATE- oder DELETE-Vorgänge für diesen Datensatz ausführt. Wenn die aktuelle Transaktion jedoch auch den Datensatz aktualisieren muss, führt dies wahrscheinlich zu einem Deadlock. Bei Anwendungen, die den Zeilendatensatz nach dem Sperren aktualisieren müssen, sollte die Methode SELECT... FOR UPDATE verwendet werden, um eine exklusive Sperre zu erhalten . Das Obige ist der Inhalt von MySQL-Transaktionen, -Sperren und -Anwendungen (2). Weitere verwandte Inhalte finden Sie auf der chinesischen PHP-Website (www.php.cn)!