Heim Datenbank MySQL-Tutorial MySQL中InnoDB的间隙锁问题_MySQL

MySQL中InnoDB的间隙锁问题_MySQL

Jun 01, 2016 pm 12:59 PM
innodb

 在为一个客户排除死锁问题时我遇到了一个有趣的包括InnoDB间隙锁的情形。对于一个WHERE子句不匹配任何行的非插入的写操作中,我预期事务应该不会有锁,但我错了。让我们看一下这张表及示例UPDATE。
 

mysql> SHOW CREATE TABLE preferences \G
*************************** 1. row ***************************
    Table: preferences
Create Table: CREATE TABLE `preferences` (
 `numericId` int(10) unsigned NOT NULL,
 `receiveNotifications` tinyint(1) DEFAULT NULL,
 PRIMARY KEY (`numericId`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1
1 row in set (0.00 sec)
mysql> BEGIN;
Query OK, 0 rows affected (0.00 sec)
mysql> SELECT COUNT(*) FROM preferences;
+----------+
| COUNT(*) |
+----------+
|    0 |
+----------+
1 row in set (0.01 sec)
mysql> UPDATE preferences SET receiveNotifications='1' WHERE numericId = '2';
Query OK, 0 rows affected (0.01 sec)
Rows matched: 0 Changed: 0 Warnings: 0

Nach dem Login kopieren

InnoDB状态显示这个UPDATE在主索引记录上持有了一个X锁:

---TRANSACTION 4A18101, ACTIVE 12 sec
2 lock struct(s), heap size 376, 1 row lock(s)
MySQL thread id 3, OS thread handle 0x7ff2200cd700, query id 35 localhost msandbox
Trx read view will not see trx with id >= 4A18102, sees < 4A18102
TABLE LOCK table `test`.`preferences` trx id 4A18101 lock mode IX
RECORD LOCKS space id 31766 page no 3 n bits 72 index `PRIMARY` of table `test`.`preferences` trx id 4A18101 lock_mode X
Nach dem Login kopieren


这是为什么呢,Heikki在其bug报告中做了解释,这很有意义,我知道修复起来很困难,但略带厌恶地我又希望它能被差异化处理。为完成这篇文章,让我证明下上面说到的死锁情况,下面中mysql1是第一个会话,mysql2是另一个,查询的顺序如下:

mysql1> BEGIN;
Query OK, 0 rows affected (0.00 sec)
mysql1> UPDATE preferences SET receiveNotifications='1' WHERE numericId = '1';
Query OK, 0 rows affected (0.00 sec)
Rows matched: 0 Changed: 0 Warnings: 0
mysql2> BEGIN;
Query OK, 0 rows affected (0.00 sec)
mysql2> UPDATE preferences SET receiveNotifications='1' WHERE numericId = '2';
Query OK, 0 rows affected (0.00 sec)
Rows matched: 0 Changed: 0 Warnings: 0
mysql1> INSERT INTO preferences (numericId, receiveNotifications) VALUES ('1', '1'); -- This one goes into LOCK WAIT
mysql2> INSERT INTO preferences (numericId, receiveNotifications) VALUES ('2', '1');
ERROR 1213 (40001): Deadlock found when trying to get lock; try restarting transaction
Nach dem Login kopieren

现在你看到导致死锁是多么的容易,因此一定要避免这种情况——如果来自于事务的INSERT部分导致非插入的写操作可能不匹配任何行的话,不要这样做,使用REPLACE INTO或使用READ-COMMITTED事务隔离。

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

Heiße KI -Werkzeuge

Undresser.AI Undress

Undresser.AI Undress

KI-gestützte App zum Erstellen realistischer Aktfotos

AI Clothes Remover

AI Clothes Remover

Online-KI-Tool zum Entfernen von Kleidung aus Fotos.

Undress AI Tool

Undress AI Tool

Ausziehbilder kostenlos

Clothoff.io

Clothoff.io

KI-Kleiderentferner

AI Hentai Generator

AI Hentai Generator

Erstellen Sie kostenlos Ai Hentai.

Heißer Artikel

R.E.P.O. Energiekristalle erklärten und was sie tun (gelber Kristall)
3 Wochen vor By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. Beste grafische Einstellungen
3 Wochen vor By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. So reparieren Sie Audio, wenn Sie niemanden hören können
3 Wochen vor By 尊渡假赌尊渡假赌尊渡假赌

Heiße Werkzeuge

Notepad++7.3.1

Notepad++7.3.1

Einfach zu bedienender und kostenloser Code-Editor

SublimeText3 chinesische Version

SublimeText3 chinesische Version

Chinesische Version, sehr einfach zu bedienen

Senden Sie Studio 13.0.1

Senden Sie Studio 13.0.1

Leistungsstarke integrierte PHP-Entwicklungsumgebung

Dreamweaver CS6

Dreamweaver CS6

Visuelle Webentwicklungstools

SublimeText3 Mac-Version

SublimeText3 Mac-Version

Codebearbeitungssoftware auf Gottesniveau (SublimeText3)

Was ist der Unterschied zwischen gesperrten und entsperrten iPhones? Ausführliche Einführung: Vergleich der Unterschiede zwischen gesperrten und entsperrten iPhones Was ist der Unterschied zwischen gesperrten und entsperrten iPhones? Ausführliche Einführung: Vergleich der Unterschiede zwischen gesperrten und entsperrten iPhones Mar 28, 2024 pm 03:10 PM

Apple-Handys sind in letzter Zeit das von den Menschen am häufigsten gewählte Mobiltelefon, aber wir sehen oft, dass Leute online über den Unterschied zwischen gesperrten und entsperrten Apple-Handys diskutieren und sich nicht sicher sind, welches sie kaufen sollen. Heute verrät Ihnen Chen Siqi den Unterschied zwischen gesperrten und entsperrten iPhones und hilft Ihnen bei der Lösung von Problemen. Tatsächlich gibt es zwischen den beiden keinen großen Unterschied in Aussehen und Funktion. Der Schlüssel liegt im Preis und in der Verwendung. Was ist eine gesperrte Version und eine entsperrte Version? Ein iPhone ohne Sperrbeschränkungen bedeutet, dass es nicht durch den Betreiber eingeschränkt wird und die SIM-Karte jedes Betreibers normal verwendet werden kann. Eine gesperrte Version bedeutet, dass sie über eine Netzwerksperre verfügt und nur die vom angegebenen Betreiber bereitgestellte SIM-Karte und keine anderen verwenden kann. Tatsächlich können entsperrte Apple-Telefone mobile,

Was ist MySQL Innodb? Was ist MySQL Innodb? Apr 14, 2023 am 10:19 AM

InnoDB ist eine der Datenbank-Engines von MySQL und einer der Standards für Binärversionen von MySQL AB. Ein zweigleisiges Autorisierungssystem ist die GPL-Autorisierung, das andere ist proprietäre Software Genehmigung. InnoDB ist die bevorzugte Engine für Transaktionsdatenbanken und unterstützt Transaktionssicherheitstabellen (ACID). InnoDB unterstützt Sperren auf Zeilenebene, die die Parallelität weitgehend unterstützen können. Sperren auf Zeilenebene werden von der Speicher-Engine-Ebene implementiert.

Wie MySQL das InnoDB-Zeilenformat anhand von Binärinhalten erkennt Wie MySQL das InnoDB-Zeilenformat anhand von Binärinhalten erkennt Jun 03, 2023 am 09:55 AM

InnoDB ist eine Speicher-Engine, die Daten in Tabellen auf der Festplatte speichert, sodass unsere Daten auch nach dem Herunterfahren und Neustarten noch vorhanden sind. Der eigentliche Prozess der Datenverarbeitung findet im Speicher statt, daher müssen die Daten auf der Festplatte in den Speicher geladen werden. Wenn eine Schreib- oder Änderungsanforderung verarbeitet wird, muss auch der Inhalt im Speicher auf der Festplatte aktualisiert werden. Und wir wissen, dass die Geschwindigkeit beim Lesen und Schreiben auf die Festplatte sehr langsam ist, was sich um mehrere Größenordnungen vom Lesen und Schreiben im Speicher unterscheidet. Wenn wir also bestimmte Datensätze aus der Tabelle abrufen möchten, muss die InnoDB-Speicher-Engine lesen die Datensätze einzeln von der Festplatte löschen? Die von InnoDB verwendete Methode besteht darin, die Daten in mehrere Seiten aufzuteilen und Seiten als grundlegende Interaktionseinheit zwischen Festplatte und Speicher zu verwenden. Die Größe einer Seite in InnoDB beträgt im Allgemeinen 16

Wie frage ich mit Oracle ab, ob eine Tabelle gesperrt ist? Wie frage ich mit Oracle ab, ob eine Tabelle gesperrt ist? Mar 06, 2024 am 11:54 AM

Titel: Wie kann ich mit Oracle abfragen, ob eine Tabelle gesperrt ist? In der Oracle-Datenbank bedeutet Tabellensperre, dass, wenn eine Transaktion einen Schreibvorgang für die Tabelle ausführt, andere Transaktionen blockiert werden, wenn sie Schreibvorgänge für die Tabelle ausführen oder strukturelle Änderungen an der Tabelle vornehmen möchten (z. B. Spalten hinzufügen, Zeilen löschen). , usw.). Im eigentlichen Entwicklungsprozess müssen wir häufig abfragen, ob die Tabelle gesperrt ist, um damit verbundene Probleme besser beheben und beheben zu können. In diesem Artikel wird erläutert, wie Sie mithilfe von Oracle-Anweisungen abfragen, ob eine Tabelle gesperrt ist, und es werden spezifische Codebeispiele aufgeführt. Um zu überprüfen, ob der Tisch gesperrt ist, haben wir

Python GIL (Global Interpreter Lock): Aufdecken der Prinzipien und Auswirkungen auf die Leistung dahinter Python GIL (Global Interpreter Lock): Aufdecken der Prinzipien und Auswirkungen auf die Leistung dahinter Feb 27, 2024 am 09:00 AM

PythonGIL (Global Interpreter Lock) ist ein wichtiger Mechanismus in Python. Er begrenzt, dass nur ein Thread gleichzeitig Python-Bytecode ausführen kann. Dies dient hauptsächlich dazu, die Stabilität des Python-Interpreters sicherzustellen, da die Speicherverwaltungs- und Garbage-Collection-Mechanismen von Python Single-Threaded sind. Wenn mehrere Threads gleichzeitig Python-Bytecode ausführen dürfen, kann es zu Speicherbeschädigungen oder anderen unvorhersehbaren Fehlern kommen. Das Prinzip von GIL ist relativ einfach. Es handelt sich um eine Sperre, die vom Python-Interpreter verwaltet wird. Wenn ein Thread Python-Bytecode ausführt, erhält er die GIL. Wenn andere Threads Python-Bytecode ausführen möchten, müssen sie auf die Freigabe der GIL warten. Wenn die GIL freigegeben wird, andere

Wie wird die Lock-in-Golang-Funktion implementiert? Wie wird die Lock-in-Golang-Funktion implementiert? Jun 05, 2024 pm 12:39 PM

Sperren in der Go-Sprache implementieren synchronisierten gleichzeitigen Code, um Datenkonkurrenz zu verhindern: Mutex: Mutex-Sperre, die sicherstellt, dass nur eine Goroutine gleichzeitig die Sperre erhält und zur Steuerung kritischer Abschnitte verwendet wird. RWMutex: Lese-/Schreibsperre, die es mehreren Goroutinen ermöglicht, Daten gleichzeitig zu lesen, aber nur eine Goroutine gleichzeitig Daten schreiben kann. Sie eignet sich für Szenarien, die häufiges Lesen und Schreiben gemeinsam genutzter Daten erfordern.

Leistungsvergleich verteilter Sperren, die von Redis implementiert wurden Leistungsvergleich verteilter Sperren, die von Redis implementiert wurden Jun 20, 2023 pm 05:46 PM

Da Internetanwendungen immer umfangreicher werden, werden verteilte Systeme immer häufiger eingesetzt. In diesen Systemen sind verteilte Sperren ein wesentliches Merkmal. Aufgrund der starken Nachfrage nach verteilten Sperren gibt es verschiedene Implementierungsmethoden. Unter diesen ist Redis ein beliebtes Tool, das häufig bei der Implementierung verteilter Sperren verwendet wird. In diesem Artikel untersuchen wir den Leistungsvergleich verteilter Sperren, die von Redis implementiert werden. 1. Grundlegende Konzepte von Redis Bevor wir die verteilte Sperrleistung von Redis diskutieren, müssen wir einige grundlegende Konzepte von Redis verstehen.

So lösen Sie Phantomlesungen in innoDB in MySQL So lösen Sie Phantomlesungen in innoDB in MySQL May 27, 2023 pm 03:34 PM

1. MySQL-Transaktionsisolationsstufe: Bei mehreren Transaktions-Parallelitätskonflikten können einige Probleme wie schmutziges Lesen, nicht wiederholbares Lesen und Phantomlesen auftreten, und innoDB löst sie im wiederholbaren Leseisolationsstufenmodus des Phantom-Lesens, 2. Was ist Phantom-Lesen? Das bedeutet, dass in derselben Transaktion die Ergebnisse, die wir erhalten, wenn wir denselben Bereich vorher und nachher zweimal abfragen, inkonsistent sind, wie in der ersten Transaktion gezeigt Zu diesem Zeitpunkt gibt es nur ein Datenelement, das die Bedingungen erfüllt. In der zweiten Transaktion wird eine Datenzeile eingefügt und bei der ersten Transaktion erneut abgefragt Beachten Sie, dass die ersten und zweiten Abfragen der ersten Transaktion identisch sind

See all articles