Heim  >  Artikel  >  Datenbank  >  Teilen Sie die Verwendung gemeinsamer Sperren und exklusiver Sperren in MySQL

Teilen Sie die Verwendung gemeinsamer Sperren und exklusiver Sperren in MySQL

零下一度
零下一度Original
2017-04-21 15:56:393415Durchsuche


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.

Share Lock

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

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

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!

Stellungnahme:
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