Was passiert, wenn wir den JVM-Prozess während der Transaktionsausführung beenden?

8

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?

    
St.Antario 11.08.2015, 19:46
quelle

2 Antworten

7

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

    
ochi 11.08.2015, 20:05
quelle
6

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.

    
manouti 11.08.2015 20:03
quelle

Tags und Links