Frage

Ich lese ein Handbuch über InnoDB -Transaktionen, aber es gibt noch viele unklare Dinge für mich. Zum Beispiel verstehe ich das folgende Verhalten nicht ganz:

-- client 1                             -- client 2
mysql> create table simple (col int) 
       engine=innodb; 

mysql> insert into simple values(1);
Query OK, 1 row affected (0.00 sec)

mysql> insert into simple values(2);
Query OK, 1 row affected (0.00 sec)

mysql> select @@tx_isolation;                                                              
+-----------------+                                                                         
| @@tx_isolation  |
+-----------------+
| REPEATABLE-READ |                                                                         
+-----------------+

mysql> begin;                                    
Query OK, 0 rows affected (0.01 sec)            
                                        mysql> begin;
                                        Query OK, 0 rows affected (0.00 sec)

mysql> update simple set col=10 where col=1;
Query OK, 1 row affected (0.00 sec)
Rows matched: 1  Changed: 1  Warnings: 0

                                         mysql> update simple set col=42 where col=2;
                                         -- blocks

Jetzt wartet der letzte Aktualisierungsbefehl (im Client 2). Ich würde erwarten, dass der Befehl ausgeführt wird, weil ich annehmen würde, dass nur die Zeile 1 gesperrt ist. Das Verhalten ist das gleiche, auch wenn der zweite Befehl im Client 2 ist insert. Könnte jemand den sperrigen Hintergrund hinter diesem Beispiel beschreiben (wo und warum die Schlösser)?

War es hilfreich?

Lösung

InnoDB legt bestimmte Arten von Schlösser wie folgt fest.

  • Wählen Sie ... von IS eine konsistente Lektüre, lesen Sie einen Schnappschuss der Datenbank und setzen Sie keine Sperren ein, es sei denn, die Transaktions -Isolationsstufe ist auf serialisierbar eingestellt. Für serialisierbare Ebene werden die Suchsätze in den Indexaufzeichnungen, die sie begegnen, gemeinsam genutzt.

  • Wählen Sie ... von ... Sperren im Freigabemodus-Sets Shared Nächstschlüsselsperrungen für alle Indexaufzeichnungen Die Suchbegegnungen.

  • Für Indexaufzeichnungen Die Suchbegegnungen wählen Sie aus ... von ... für Aktualisierungsblöcke andere Sitzungen aus SELECT ... From ... Sperre im Freigabemodus oder vom Lesen in bestimmten Transaktions -Isolationsstufen. Konsistente Lesevorgänge ignorieren alle Sperrungen, die in den Datensätzen in der Read -Ansicht festgelegt sind.

  • Update ... wo ... legt eine exklusive Sperre für die nächste Schlüsse für alle Aufzeichnungen der Suchbegegnungen fest.

  • Löschen Sie von ... wo ... legt eine exklusive Sperre für die nächste Schlüsse für alle Aufzeichnungen der Suchbegegnungen fest.

  • Fügen Sie ein exklusives Schloss in die einfügige Zeile ein. Dieses Schloss ist ein Indexrekordschloss, kein Sperren der nächsten Schlüssel (dh es gibt keine Lückensperrung) und verhindert nicht, dass andere Sitzungen vor der eingeführten Zeile in die Lücke einfügen.

InnoDB hat verschiedene Arten von Schlösser auf Datensatzebene:

  • Datensatzsperre: Dies ist eine Sperre für einen Indexdatensatz.

  • Gap Lock: Dies ist eine Sperre für eine Lücke zwischen Indexdatensätzen oder einer Sperre für die Lücke vor dem ersten oder nach dem letzten Indexdatensatz.

  • Nächstschlüssel: Dies ist eine Kombination aus einer Datensatzsperrung im Indexdatensatz und einer Lückensperrung der Lücke vor dem Indexdatensatz.

Mehr sehen :

Vermeiden Sie das Phantomproblem mit der Sperrung der nächsten Schlüsse

Deadlock vermeiden

Andere Tipps

Ypercube hat es richtig. Insbesondere ohne einen eindeutigen Index, der in dem Zustand verwendet wird, sperrt er mehr als die einzelne Zeile, die betroffen ist.

Um das Verhalten zu sehen, das Sie erwarten, ändern Sie Ihre Tischerstellung in dies:

create table simple (col int unique) ENGINE=InnoDB;

Der eindeutige Index auf dem col Das Feld ermöglicht es, nur die betroffene Reihe zu sperren.

"Für Indexaufzeichnungen die Suchbegegnungen wählen Sie ... aus ... für Aktualisierung von Blocks andere Sitzungen aus SELECT ... aus ... Sperren im Freigabemodus oder vom Lesen in bestimmten Transaktions -Isolationsstufen. Konsistente Lesevorgänge ignorieren alle Sperren Legen Sie die Datensätze fest, die in der Read -Ansicht existieren. "

Was sind die bestimmten Sperren, die mit SELECT for Update angewendet werden können, damit andere Sitzungen den gesperrten Datensatz nicht lesen können?

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top