2015-08-19 12 views
20

Ich weiß, es gibt ein Problem in mysql mit gleichzeitiger Auswahl und einfügen. Wie auch immer, meine Frage ist, wenn ich zwei Verbindungen mit mysql öffne und Daten mit beiden laden, nimmt mysql Daten gleichzeitig oder wartet auf einen vor dem Laden eines anderen?Concurrent einfügen mit MySQL

aktualisiert

Ich mag würde wissen, wie mysql verhält sich in beiden Fällen, wie wenn ich Daten in der gleiche Tabelle oder verschiedene Tabellen gleichzeitig zu laden versuchen (separate Verbindungen zu öffnen).

+1

Diese Frage ist zu breit. Können Sie Code posten und nach bestimmten Punkten im Code fragen? – danihp

Antwort

16

Wenn Sie eine völlig neue Verbindung zur Datenbank erstellen und durchführen Einsätze sowohl auf die Verbindung, aus Sicht der Datenbank wird es noch sequentielle werden. Die Dokumentation von Concurrent Inserts auf der Dokumentationsseite der MySQL sagt:

Wenn mehrere INSERT-Anweisungen sind, werden sie in die Warteschlange gestellt und in Folge durchgeführt, gleichzeitig mit den SELECT-Anweisungen.

Verstand, dass es keine Kontrolle über die Reihenfolge ist, in der zwei gleichzeitige Einsätze stattfinden wird. Die Reihenfolge in dieser Nebenläufigkeit ist einer Vielzahl von verschiedenen Faktoren ausgesetzt. Um die Reihenfolge zu gewährleisten, müssen Sie standardmäßig auf Nebenläufigkeit verzichten.

+0

also, was ist, wenn es die gleiche Datenbank ist, aber verschiedene Tabellen? –

+0

@ user3360140: In diesem Fall konkurrieren die Verbindungen nicht um die Tabelle zu sperren. Daher erhalten beide die Sperre und können gleichzeitig in beide Tabellen eingefügt werden. – displayName

+1

genial. Danke vielmals! –

7

Sie fragen nach Deadlock-Erkennung, ACID und besonders MVCC, Sperren und Transaktionen:

Deadlock-Erkennung und Rollback

InnoDB erkennt automatisch Transaktion Deadlocks und Rollback eine Transaktion oder Transaktionen zu brechen der Stillstand. InnoDB versucht, kleine Transaktionen auszuwählen, die zurückgesetzt werden sollen, wobei die Größe einer Transaktion durch die Anzahl der eingefügten, aktualisierten oder gelöschten Zeilen bestimmt wird. Wenn InnoDB einen vollständigen Rollback einer Transaktion durchführt, werden alle durch die Transaktion festgelegten Sperren freigegeben. Wenn jedoch nur eine einzelne SQL -Anweisung aufgrund eines Fehlers zurückgesetzt wird, können einige der durch die Anweisung gesetzten Sperren beibehalten werden. Dies geschieht, weil InnoDB Zeilensperren in einem Format speichert, so dass es später nicht wissen kann, welche Sperre durch welche Anweisung gesetzt wurde.

https://dev.mysql.com/doc/refman/5.6/en/innodb-deadlock-detection.html

Das System eine Transaktion vom Sehen oder Ändern von Daten zu schützen Sperren, die von anderen Transaktionen abgefragt oder geändert wird. Die sperrende Strategie muss Zuverlässigkeit und Konsistenz der Datenbankoperationen (die Prinzipien der ACID-Philosophie) gegen die Leistung ausgleichen, die für gute Parallelität benötigt wird. Feinabstimmung der Locking Strategie beinhaltet oft die Auswahl einer Isolationsstufe und sicherstellen, dass alle Ihre Datenbank-Operationen sind sicher und zuverlässig für diese Isolation Ebene.

http://dev.mysql.com/doc/refman/5.5/en/glossary.html#glos_locking

ACID

Abkürzung für die Unteilbarkeit stehen, Konsistenz, Isolation und Haltbarkeit. Diese Eigenschaften sind alle in einem Datenbanksystem wünschenswert und sind alle eng mit dem Begriff einer Transaktion verbunden. Die Transaktionsfunktionen von InnoDB folgen den ACID-Prinzipien. Transaktionen sind atomare Arbeitseinheiten, die festgeschrieben oder gerollt werden können zurück.Wenn eine Transaktion mehrere Änderungen an der Datenbank vornimmt, sind entweder alle Änderungen erfolgreich, wenn die Transaktion festgeschrieben wird, oder alle Änderungen werden rückgängig gemacht, wenn die Transaktion zurückgesetzt wird. Die -Datenbank bleibt zu jedem Zeitpunkt in einem konsistenten Zustand - nach jedem Festschreiben oder Rollback und während Transaktionen laufen. Wenn verwandte Daten über mehrere Tabellen hinweg aktualisiert werden, sehen Abfragen entweder alle alten Werte oder alle neuen Werte, keine Mischung aus alten und neuen Werten. Transaktionen werden voneinander geschützt (isoliert), während sie in Bearbeitung sind; Sie können sich nicht gegenseitig stören oder sich gegenseitig die unverbundenen Daten ansehen. Diese Isolierung wird durch den Verriegelungsmechanismus erreicht. Erfahrene Benutzer können die Isolationsstufe anpassen, aus weniger Schutz zugunsten der erhöhten Leistung und Nebenläufigkeit, , wenn sie sicher sein können, dass die Transaktionen wirklich nicht stören miteinander.

http://dev.mysql.com/doc/refman/5.5/en/glossary.html#glos_acid

MVCC

InnoDB ist eine Multiversion Concurrency Control (MVCC) Speicher-Engine die zur gleichen Zeit existieren können viele Versionen der einzelnen Reihe bedeutet. Tatsächlich kann es eine große Anzahl solcher Zeilenversionen geben. Je nach dem von Ihnen gewählten Isolationsmodus muss InnoDB möglicherweise alle Zeilenversionen zurück zur frühesten aktiven Leseansicht halten, aber mindestens müssen alle Versionen zurück zu dem Start der SELECT-Abfrage halten die derzeit läuft

https://www.percona.com/blog/2014/12/17/innodbs-multi-versioning-handling-can-be-achilles-heel/

3

Es kommt darauf an.

Es hängt vom Client ab - einige Clients erlauben den gleichzeitigen Zugriff; Einige serialisieren den Zugriff und verlieren dadurch den erwarteten Gewinn. Sie haben nicht einmal PHP vs Java vs ... oder Apache vs ... oder Windows vs ... angegeben. Viele Kombinationen bieten einfach keine Parallelität.

Bei verschiedenen Tabellen gibt es nur allgemeine Argumente für E/A, CPU, Mutex auf dem Pufferpool usw. Eine angemessene Parallelität ist möglich.

Wenn dieselbe Tabelle, hängt es von den Indizes und Zugriffsmustern ab.In einigen Fällen blockieren sich die Threads gegenseitig. In einigen Fällen wird sogar eine der Transaktionen "blockiert" und zurückgesetzt. Deadlocks verlangsamen nicht nur Sie, sondern Sie versuchen, die Einsätze erneut zu versuchen.

Wenn Sie eine hohe Aufnahmegeschwindigkeit für viele Reihen suchen, siehe my blog. Es legt Techniken fest und weist auf die Verzweigungen wie Replikation, Engine-Auswahl und Multithreading hin.

Mehrere Threads einfügen in die gleichen Tabellen - Es hängt viel von den Werten, die Sie für alle PRIMARY oder UNIQUE Schlüssel zur Verfügung stellen. Es hängt davon ab, ob in derselben Transaktion andere Aktionen ausgeführt werden. Es hängt davon ab, wie viel I/O beteiligt ist. Es hängt davon ab, ob Sie einreihige Einfügungen oder eine Stapelverarbeitung durchführen. Es hängt von ... ab (Entschuldigung, um vage zu sein, aber Ihre Frage ist nicht sehr spezifisch.)

Wenn Sie Details auf zwei oder drei Designs darstellen möchten, können wir die Besonderheiten besprechen.

5

MySQL tut parallel Insertion in derselben Tabelle unterstützen.

Ansätze für gleichzeitiges Lesen/Schreiben hängen von der Speicher-Engine ab, die Sie verwenden.

InnoDB

MySQL verwendet Sperren auf Zeilenebene für InnoDB Tabellen simultanen Schreibzugriff durch mehrere Sitzungen zu unterstützen, so dass sie geeignet für die Mehrbenutzer-Herstellung, gleichzeitig hoch und OLTP-Anwendungen.

MyISAM

MySQL verwendet Sperren auf Tabellenebene für MyISAM, MEMORY und MERGE-Tabellen, so dass nur eine Sitzung, diese Tabellen zu einem Zeitpunkt zu aktualisieren, so dass sie besser geeignet für schreibgeschützt zu machen, schreib meist oder Einzelplatzanwendungen

Aber das oben genannte Verhalten von MyISAM-Tabellen kann durch concurrent_insert Systemvariable geändert werden, um gleichzeitiges Schreiben zu erreichen. Bitte beziehen Sie sich auf link für Details.

Daher unterstützt MySQL die gleichzeitige Einfügung für InnoDB und MyISAM Speicher-Engine.