2017-05-15 5 views
0

JDBCトランザクションから値を返すことはできますか?たとえば、次のトランザクションを適用した後、 'key'に対応する値が1か-1 のすぐにかどうかを知る必要があるとします。キー上の次のSELECTを実行すると競合状態が発生します。これは、別の並行プロセスが、最初の完了後で、その後のSELECTの実行前に同じトランザクションを実行する可能性があるためです。取引が私に価値を返すことは可能ですか?JDBCトランザクションからの戻り値

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(); 

答えて

2

これにはRETURNING句を使用できます。しかし、それから値を処理できるように、あなたは​​代わりの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

またはワンショット 'ResultSetの結果に= statement.executeUpdate(「クエリ」)を使用する必要があります;'、** NOTE **我々 'INSERT UPDATE AND DELETE'で' executeUpdate'を使うことができますか?もっと読む[here](https://www.tutorialspoint.com/jdbc/statement-object-example.htm) –

+0

@YCF_L: 'executeUpdate結果を返すクエリの場合は ''() ''となります。 [APIドキュメントの引用](http://docs.oracle.com/javase/8/docs/api/java/sql/Statement.html#executeUpdate-java.lang.String-): "*指定したSQLを実行します文、(...)**は何も返しません*** "。 Postgresドライバ**は、結果を返すクエリで 'executeUpdate()'を使用すると、 "期待されなかったときに結果が返され"て失敗します**。 –

+0

私は 'int result = statement.executeUpdate(" query ");'を意味していました。結果が大きい場合は0、実行されているステートメントが1つ以上ある場合は0、結果が0の場合はレコードが更新または挿入されていないことを意味します。削除されたので、結果セットを使用する必要はありません。 –