JDBC事务的返回值

时间:2017-05-15 02:51:46

标签: postgresql jdbc transactions

是否可以从JDBC事务中返回值?例如,假设我需要知道对应于' key'的值。在应用以下事务后,立即为1或-1 。在密钥上执行后续SELECT会引入竞争条件,因为另一个并发进程可能在第一次完成之后但在执行后续SELECT之前执行相同的事务。交易是否有可能将价值返还给我?

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

1 个答案:

答案 0 :(得分:2)

您可以使用RETURNING子句。但是为了能够处理该值,您必须使用execute()而不是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
}