Ich benutze PostgreSQL 9.4.
Was passiert, wenn jemand den JVM-Prozess während der Transaktionsstapelaktualisierung (Stapelgröße = 50) beendet, wenn einige der Abfragen im Stapel bereits ausgeführt wurden?
Was wird in der Datenbank sein?
Erwartetes Verhalten ist, dass die Transaktionen, die nicht festgeschrieben werden, auf der DB-Seite Timeout und Rollback sind. Transaktionen, die festgeschrieben sind, sind, gut, verpflichtet.
Integration der Antworten aus verschiedenen Kommentaren:
Wenn einige tatsächlich ausgeführt wurden, aber andere nicht, dann ist es kein Stapel. In einem transaktionalen Batch werden entweder alle von ihnen in der Realität ausgeführt oder keine von ihnen. - Peter Lawrey
Noch ein
Stellen Sie sich folgendes vor: 1- jvm startet die Transaktion; 2-Datenbank macht den Prozess; 3 - jvm sendet das Commit zum Beenden der Transaktion, wenn Sie die JVM töten, egal was passiert in der Datenbank wird es nicht das Commit ausführen, daher wird es Rollback - Jorge Campos
Zuletzt für PostgreSQL
Was wird in der Datenbank sein? - & gt; Alles und nur was erfolgreich durchgeführt wurde. Alles andere wird es nicht schaffen. (Wenn Ihr "Batch" -Prozess keine Transaktionen verwendet, ist Ihre Datenbank wahrscheinlich inkonsistent, zumindest aus betriebswirtschaftlicher Sicht, da PostgreSQL als anständiges ACID-RDBMS aus einer strengen Datenperspektive die Dauerhaftigkeit garantieren kann [aka was committed / inserted bleibt, wird committed / eingefügt]. - acdcjunior
Es gibt zwei Situationen, in denen die Verbindung sein kann: entweder im Auto-Commit-Modus oder nicht im Auto-Commit-Modus (durch Aufruf von Connection#setAutoCommit(false)
).
Im ersten Fall kann es bei der Ausführung eines Stapels von SQL-Aktualisierungsbefehlen eine teilweise Ausführung von Befehlen geben, d. h. einige Befehle können festgeschrieben werden und andere werden noch nicht ausgeführt. Sehen Sie dieses Zitat aus der Dokumentation von Statement#executeBatch()
:
Wenn einer der Befehle in einer Stapelaktualisierung nicht ordnungsgemäß ausgeführt wird, gibt diese Methode
BatchUpdateException
aus, und ein JDBC-Treiber kann die restlichen Befehle im Stapel möglicherweise weiter verarbeiten. Das Verhalten des Treibers muss jedoch mit einem bestimmten DBMS konsistent sein, dh entweder Befehle werden immer weiter verarbeitet oder Befehle werden nicht weiter verarbeitet.
Wenn sich eine Verbindung nicht im automatischen Festschreibungsmodus befindet, kann nur angenommen werden, dass alle übermittelten Befehle festgeschrieben wurden, wenn ein Aufruf von Connection#commit
zurückgegeben wird. Entweder alle oder keine sind nach diesem Aufruf festgeschrieben.
Tags und Links java postgresql jdbc