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?
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.
"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 ...
... 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. .
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.
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.
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?
"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. .
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.
Tags und Links sql mysql insert atomic sql-update