2017-05-15 3 views
0

Kann ein Wert aus einer JDBC-Transaktion zurückgegeben werden? Angenommen, ich muss wissen, ob der Wert für "Schlüssel" nach Anwendung der folgenden Transaktion 1 oder -1 sofort ist. Das Ausführen einer nachfolgenden SELECT auf dem Schlüssel führt zu einer Race-Bedingung, da ein anderer gleichzeitiger Prozess die gleiche Transaktion nach dem ersten Abschluss, aber bevor der nachfolgende SELECT ausgeführt wird, ausführen kann. Kann die Transaktion den Wert an mich zurückgeben?Rückgabewert von JDBC-Transaktion

con.setAutoCommit(false) 
val stmt = con.createStatement() 
stmt.executeUpdate("UPDATE table SET value = CASE WHEN value > 0 THEN -1 ELSE 1 END WHERE key = 'key'"); 
con.commit(); 

Antwort

2

Sie können die Klausel RETURNING dafür verwenden. Aber in der Lage sein, den Wert von dem zu verarbeiten, haben Sie execute() statt executeUpdate()

con.setAutoCommit(false) 
Statement stmt = con.createStatement() 
stmt.execute("UPDATE table SET value = CASE WHEN value > 0 THEN -1 ELSE 1 END WHERE key = 'key' RETURNING value"); 
ResultSet rs = stmt.getResultSet(); 
if (rs.next()) { 
    int key = rs.getInt(1); 
    ... do something with that 
} 
+0

oder in einem Schuss 'ResultSet result = Statement.executeUpdate ("query") zu verwenden;' ** Anmerkung ** wir Können wir auch 'executeUpdate' mit' INSERT UPDATE AND DELETE' verwenden, lesen Sie mehr [hier] (https://www.tutorialspoint.com/jdbc/statement-object-example.htm) –

+0

@YCF_L: Sie können 'executeUpdate nicht verwenden() 'für Abfragen, die ein Ergebnis zurückgeben. [Zitat aus den API-Dokumenten] (http://docs.oracle.com/javase/8/docs/api/java/sql/Statement.html#executeUpdate-java.lang.String-): "* Führt die angegebene SQL aus Aussage, (...) ** die nichts zurückgibt *** ". Und der Postgres-Treiber ** scheitert ** mit "Ein Ergebnis wurde zurückgegeben, wenn nichts erwartet wurde", wenn Sie 'executeUpdate()' mit einer Abfrage verwenden, die ein Ergebnis zurückgibt. –

+0

ich meinte 'int result = statement.executeUpdate (" query ");' also wenn das Ergebnis groß ist, dann bedeutet 0, dass Sie eine oder mehrere Anweisungen ausgeführt haben, andernfalls, wenn das Ergebnis 0 bedeutet, dass kein Datensatz aktualisiert oder eingefügt wird oder gelöscht, so sehe ich keine Notwendigkeit, ResultSet –