30 Stimmen

Wie kann ich eine laufende JDBC-Transaktion abbrechen?

Gibt es eine Möglichkeit, eine Transaktion vorzeitig abzubrechen? Angenommen, ich habe einen Befehl an die Datenbank gesendet, der fünf Minuten läuft, und nach vier Minuten möchte ich ihn abbrechen.

Definiert JDBC eine Möglichkeit, ein "Stoppen, was auch immer Sie auf dieser Verbindung tun" Signal an die DB zu senden?

38voto

John M Punkte 12793

Wie von james erwähnt, [Anweisung.abbrechen()](https://docs.oracle.com/javase/7/docs/api/java/sql/Statement.html#cancel()) bricht die Ausführung einer laufenden Anweisung (Select, Update usw.) ab. In den JDBC-Dokumenten heißt es ausdrücklich, dass Statement.cancel() sicher von einem anderen Thread aus ausgeführt werden kann, und es wird sogar vorgeschlagen, die Funktion in einem Timeout-Thread aufzurufen.

Nachdem Sie den Kontoauszug storniert haben, müssen Sie die Transaktion noch rückgängig machen. Das ist pas als sicher für die Ausführung von einem anderen Thread dokumentiert. Die Website [Verbindung.rollback()](https://docs.oracle.com/javase/7/docs/api/java/sql/Connection.html#rollback()) sollte in dem Haupt-Thread erfolgen, der alle anderen JDBC-Aufrufe ausführt. Sie können dies behandeln, nachdem der abgebrochene Statement.execute...()-Aufruf mit einer JDBCException (aufgrund des Abbruchs) abgeschlossen wurde.

17voto

Gowri Punkte 1313

Ich vermute, Sie wollen verhindern, dass Ihre Anwendung bei lang laufenden Abfragen/Transaktionen blockiert. Zu diesem Zweck unterstützt JDBC das Konzept eines Abfrage-Timeouts. Sie können den Abfrage-Timeout wie folgt einstellen:

java.sql.Statement.setQueryTimeout(seconds)

Und behandeln Sie die SQLException geworfen von der execute() Methode, indem Sie die Transaktion zurücksetzen (das funktioniert natürlich nur, wenn Sie autocommit auf false gesetzt haben und Ihr JDBC-Treiber Statement.cancel() unterstützt).

8voto

james Punkte 234

Probieren Sie Statement.cancel() aus.

-5voto

Marko Punkte 29192

Nein, mit der Standard-JDBC können Sie den Vorgang nicht abbrechen.

Sie können versuchen zu prüfen, ob Ihr spezielles RDBMS eine Erweiterung zur Unterstützung dieser Funktion definiert.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X