Sind mysql mehrere Inserts innerhalb einer einzelnen atomaren Abfrage?

8

Ich mache mehrere Einfügungen in einer einzelnen -Abfrage:

%Vor%

Nun nehmen wir an, dass in der Abfrage Zehntausende von Werten angegeben sind (daher die Ellipse) ....

Kann es jemals einen Fall geben, in dem einige Teile der VALUES es geschafft haben, in die Datenbank eingefügt / aktualisiert zu werden, aber der Rest wurde möglicherweise wegen irgendeiner Art von db error / failure / memory-running-out nicht eingefügt / aktualisiert usw.?

Sind mysql Abfragen ALL oder Nothing?

Stimmt es, dass bei jeder ausgeführten mysql-Abfrage entweder alle in der Abfrage angegebenen Werte problemlos eingefügt / aktualisiert werden oder keiner der Werte eingefügt / aktualisiert wird?

    
pillarOfLight 05.02.2014, 17:27
quelle

4 Antworten

11
Die Eigenschaften

ACID (Atomarität, Konsistenz, Isolation, Dauerhaftigkeit) werden verwendet, um ein solches Verhalten in Datenbanken zu beschreiben. Atomarität ist nur wichtig, wenn es sich um gleichzeitige Änderungen handelt. Um Konsistenz zu gewährleisten, muss eine bestimmte Isolationsstufe erreicht werden. Je mehr isoliert mehrere Transaktionen ausgeführt werden, desto weniger Leistung hat das DBMS normalerweise. So gibt es die sogenannte " Isolationsstufe ", die angibt, welche Fehler möglicherweise in einem auftreten können DBMS und was nicht.

Nun implementiert MySQL alle Isolationsstufen in INNODB-Datenbanken und Sie können für jede Transaktion wählen: Ссылка

MyIsam-Datenbanken unterstützen keine Transaktionen, einzelne Operationen sollten jedoch atomar ausgeführt werden. (Quelle: Ссылка ). Beachten Sie jedoch, dass dies NICHT garantiert, dass Daten zwischen den Lese- und Schreibvorgängen in einer Operation nicht geändert werden - Atomarität in DBMS-Bedingungen bedeutet nur, dass die Operation entweder vollständig durchgeführt oder vollständig übersprungen wurde. Es garantiert NICHT Isolation, Konsistenz oder Haltbarkeit.

    
Johannes H. 05.02.2014, 17:41
quelle
4

"Kann es jemals einen Fall geben, bei dem es gelungen ist, Teile der VALUES in die Datenbank einzufügen / zu aktualisieren, aber der Rest wurde möglicherweise wegen einer Art db error / failure / memory nicht eingefügt / aktualisiert -Rennen usw.?

Späte Antwort, aber vielleicht interessant: [ON DUPLICATE KEY] UPDATE ist nicht streng atomar für einzelne Zeilen (weder für MyISAM , noch für InnoDB ), aber es wird bezüglich Fehlern atomar sein .

Was ist der Unterschied? Nun, dies illustriert das potentielle Problem bei der Annahme einer strikten Atomizität:

%Vor%

(47, 1, 450, 2) wird in (47, 0, 450, 2) und nicht in (47, 0, 400, 5) umgewandelt. Wenn Sie von strict atomicity ausgehen (was nicht heißen sollte, dass Sie dieses Verhalten bevorzugen sollten), sollte das nicht passieren - foo sollte sich sicher nicht ändern, bevor die Werte der anderen Spalten gerade sind em> evaluiert . foo sollte sich zusammen mit den anderen Spalten ändern - all or nothing .

Wenn ich atomar in Bezug auf Fehler sage, meine ich, dass wenn Sie die Bedingung IF() im obigen Beispiel entfernen, die die striktere Situation hervorhebt, so ...

%Vor%

... Sie werden immer entweder mit (48, 1, 450, 2) oder (48, 0, 400, 5) enden, nachdem Ihre Anweisung beendet / abgestürzt ist, und nicht einige Zwischenzustände wie (48, 0, 450, 2) .

Dasselbe gilt für das Verhalten von UPDATE , aber es gibt noch weniger Gründe dafür, IF() -Anweisungen dort zu jonglieren, da Sie dort einfach Ihre Bedingungen in Ihre WHERE -Klausel setzen können.

Zusammenfassend: Außerhalb von Kantenfällen haben Sie eine Atomizität für Einzelzeilenanweisungen, selbst wenn Sie MyISAM verwenden. Weitere Informationen finden Sie unter Johannes H. .

    
pinkgothic 07.10.2014 08:38
quelle
1
___ qstnhdr ___ Sind mysql mehrere Inserts innerhalb einer einzelnen atomaren Abfrage? ___ answer21584504 ___
Die Eigenschaften

ACID (Atomarität, Konsistenz, Isolation, Dauerhaftigkeit) werden verwendet, um ein solches Verhalten in Datenbanken zu beschreiben. Atomarität ist nur wichtig, wenn es sich um gleichzeitige Änderungen handelt. Um Konsistenz zu gewährleisten, muss eine bestimmte Isolationsstufe erreicht werden. Je mehr isoliert mehrere Transaktionen ausgeführt werden, desto weniger Leistung hat das DBMS normalerweise. So gibt es die sogenannte " Isolationsstufe ", die angibt, welche Fehler möglicherweise in einem auftreten können DBMS und was nicht.

Nun implementiert MySQL alle Isolationsstufen in INNODB-Datenbanken und Sie können für jede Transaktion wählen: Ссылка

MyIsam-Datenbanken unterstützen keine Transaktionen, einzelne Operationen sollten jedoch atomar ausgeführt werden. (Quelle: Ссылка ). Beachten Sie jedoch, dass dies NICHT garantiert, dass Daten zwischen den Lese- und Schreibvorgängen in einer Operation nicht geändert werden - Atomarität in DBMS-Bedingungen bedeutet nur, dass die Operation entweder vollständig durchgeführt oder vollständig übersprungen wurde. Es garantiert NICHT Isolation, Konsistenz oder Haltbarkeit.

    
___ tag123mysql ___ MySQL ist ein freies, relationales Datenbank-Managementsystem (RDBMS), das die strukturierte Abfragesprache (SQL) verwendet. Verwenden Sie dieses Tag NICHT für andere DBs wie SQL Server, SQLite usw. Dies sind verschiedene DBs, die alle SQL verwenden, um die Daten zu verwalten. ___ tag123sql ___ Structured Query Language (SQL) ist eine Sprache für die Abfrage von Datenbanken. Fragen sollten Codebeispiele, Tabellenstruktur, Beispieldaten und ein Tag für die verwendete DBMS-Implementierung (z. B. MySQL, PostgreSQL, Oracle, MS SQL Server, IBM DB2 usw.) enthalten. Wenn sich Ihre Frage nur auf ein bestimmtes DBMS bezieht (verwendet bestimmte Erweiterungen / Funktionen), verwenden Sie stattdessen das Tag des DBMS. Antworten auf mit SQL gekennzeichnete Fragen sollten den ISO / IEC-Standard SQL verwenden. ___ answer21584328 ___

Einzelne Anweisungen wie diese sind. Wenn Sie mehrere Aufrufe benötigen, um atomar zu agieren, können Sie Transaktionen in den meisten relationalen Beziehungen verwenden Datenbanken.

    
___ tag123insert ___ Insert ist eine Aktion zum Hinzufügen von Informationen zu einem größeren Container, in dem die Informationen gespeichert werden sollen. Einige Beispiele umfassen das Einfügen einer Datei in ein Dateisystem, das Einfügen eines Datensatzes in eine Datenbank oder das Einfügen eines Elements in eine Liste. ___ tag123sqlupdate ___ Eine SQL UPDATE-Anweisung wird verwendet, um vorhandene Zeilen in einer Tabelle zu ändern. ___ tag123atomic ___ Eine atomare Operation ist unteilbar. Dieser Begriff wird verwendet, um Transaktionen in Datenbanken, Low-Level-Zugriffe in Multithread-Programmen und Dateisystemoperationen zu beschreiben. ___ qstntxt ___

Ich mache mehrere Einfügungen in einer einzelnen -Abfrage:

%Vor%

Nun nehmen wir an, dass in der Abfrage Zehntausende von Werten angegeben sind (daher die Ellipse) ....

Kann es jemals einen Fall geben, in dem einige Teile der VALUES es geschafft haben, in die Datenbank eingefügt / aktualisiert zu werden, aber der Rest wurde möglicherweise wegen irgendeiner Art von db error / failure / memory-running-out nicht eingefügt / aktualisiert usw.?

Sind mysql Abfragen ALL oder Nothing?

Stimmt es, dass bei jeder ausgeführten mysql-Abfrage entweder alle in der Abfrage angegebenen Werte problemlos eingefügt / aktualisiert werden oder keiner der Werte eingefügt / aktualisiert wird?

    
___ answer26231914 ___

"Kann es jemals einen Fall geben, bei dem es gelungen ist, Teile der VALUES in die Datenbank einzufügen / zu aktualisieren, aber der Rest wurde möglicherweise wegen einer Art db error / failure / memory nicht eingefügt / aktualisiert -Rennen usw.?

Späte Antwort, aber vielleicht interessant: %code% ist nicht streng atomar für einzelne Zeilen (weder für %code% , noch für %code% ), aber es wird bezüglich Fehlern atomar sein .

Was ist der Unterschied? Nun, dies illustriert das potentielle Problem bei der Annahme einer strikten Atomizität:

%Vor%

%code% wird in %code% und nicht in %code% umgewandelt. Wenn Sie von strict atomicity ausgehen (was nicht heißen sollte, dass Sie dieses Verhalten bevorzugen sollten), sollte das nicht passieren - %code% sollte sich sicher nicht ändern, bevor die Werte der anderen Spalten gerade sind em> evaluiert . %code% sollte sich zusammen mit den anderen Spalten ändern - all or nothing .

Wenn ich atomar in Bezug auf Fehler sage, meine ich, dass wenn Sie die Bedingung %code% im obigen Beispiel entfernen, die die striktere Situation hervorhebt, so ...

%Vor%

... Sie werden immer entweder mit %code% oder %code% enden, nachdem Ihre Anweisung beendet / abgestürzt ist, und nicht einige Zwischenzustände wie %code% .

Dasselbe gilt für das Verhalten von %code% , aber es gibt noch weniger Gründe dafür, %code% -Anweisungen dort zu jonglieren, da Sie dort einfach Ihre Bedingungen in Ihre %code% -Klausel setzen können.

Zusammenfassend: Außerhalb von Kantenfällen haben Sie eine Atomizität für Einzelzeilenanweisungen, selbst wenn Sie %code% verwenden. Weitere Informationen finden Sie unter Johannes H. .

    
___
TypeIA 05.02.2014 17:32
quelle
0

Einzelne Anweisungen wie diese sind. Wenn Sie mehrere Aufrufe benötigen, um atomar zu agieren, können Sie Transaktionen in den meisten relationalen Beziehungen verwenden Datenbanken.

    
krowe 05.02.2014 17:32
quelle

Tags und Links