Unter den Sperren auf Zeilenebene, Sperren auf Tabellenebene und Sperren auf Seitenebene in MySQL sind Sperren auf Zeilenebene die granularsten Sperren, die in MySQL möglich sind Reduzieren Sie Konflikte bei Datenbankoperationen. Sperren auf Zeilenebene werden in gemeinsame Sperren und exklusive Sperren unterteilt. In diesem Artikel werden die Konzepte, Verwendung und Vorsichtsmaßnahmen von gemeinsam genutzten Sperren und exklusiven Sperren ausführlich vorgestellt.
Shared Lock, auch Lesesperre genannt, ist eine Sperre, die durch einen Lesevorgang erstellt wird. Andere Benutzer können die Daten gleichzeitig lesen, aber keine Transaktion kann die Daten ändern (eine exklusive Sperre für die Daten erwerben), bis alle gemeinsamen Sperren aufgehoben wurden.
Wenn die Transaktion T
den Daten A
eine gemeinsame Sperre hinzufügt, können andere Transaktionen nur gemeinsame Sperren zu A
und keine exklusiven Sperren hinzufügen. Transaktionen, denen gemeinsame Sperren gewährt werden, können nur Daten lesen und keine Daten ändern.
Verwendung
SELECT ... LOCK IN SHARE MODE;
Fügen Sie LOCK IN SHARE MODE
nach der Abfrageanweisung hinzu. MySQL fügt jeder Zeile im Abfrageergebnis eine Freigabe hinzu. Wenn kein anderer Thread eine exklusive Sperre für eine Zeile im Abfrageergebnissatz verwendet, kann er erfolgreich eine gemeinsame Sperre beantragen, andernfalls wird er blockiert. Andere Threads können auch Tabellen lesen, die gemeinsame Sperren verwenden, und diese Threads lesen dieselbe Version der Daten.
Exklusive Sperre wird auch Schreibsperre und exklusive Sperre genannt. Wenn eine Transaktion T
den Daten eine exklusive Sperre hinzufügt A
, können andere Transaktionen nicht mehr darauf zugreifen A
Fügen Sie jede Art von Blockade hinzu. Transaktionen mit exklusiven Sperren können Daten sowohl lesen als auch ändern.
Verwendung
SELECT ... FOR UPDATE;
Fügen Sie FOR UPDATE
nach der Abfrageanweisung hinzu. MySQL fügt jeder Zeile im Abfrageergebnis eine exklusive Sperre hinzu. Wenn kein anderer Thread eine exklusive Sperre für eine Zeile im Abfrageergebnissatz verwendet, kann er erfolgreich eine exklusive Sperre beantragen, andernfalls wird er blockiert.
Absichtssperre ist eine Sperre auf Tabellenebene, die hauptsächlich dazu dient, die Art der Sperre offenzulegen, die für die nächste Zeile in einer Transaktion angefordert wird. Zwei Tabellensperren in InnoDB:
Intention Shared Lock (IS): Zeigt an, dass die Transaktion das Hinzufügen einer gemeinsamen Sperre zur Datenzeile vorbereitet, was bedeutet, dass eine Datenzeile abgerufen werden muss vor dem Hinzufügen einer gemeinsamen Sperre. IS
Sperre der Tabelle;
Absicht exklusive Sperre (IX): ähnlich wie oben, was darauf hinweist, dass die Transaktion das Hinzufügen einer exklusiven Sperre vorbereitet Die Datenzeile zeigt an, dass die Transaktion zuvor eine exklusive Sperre zu einer Datenzeile hinzufügt. Zuerst muss die IX
-Sperre der Tabelle erhalten werden.
Absichtssperren werden von InnoDB automatisch hinzugefügt und erfordern keinen Benutzereingriff.
Für INSERT
, UPDATE
und DELETE
fügt InnoDB automatisch exklusive Sperren zu den betreffenden Daten hinzu; für allgemeine SELECT
-Anweisungen fügt InnoDB keine Sperren hinzu und Transaktionen können über durchgeführt werden Die folgenden Anweisungen fügen explizit gemeinsame Sperren oder exklusive Sperren hinzu.
Gemeinsame Sperre: SELECT ... LOCK IN SHARE MODE;
Exklusive Sperre: SELECT ... FOR UPDATE;
Das obige ist der detaillierte Inhalt vonTeilen Sie die Verwendung gemeinsamer Sperren und exklusiver Sperren in MySQL. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!