【问题标题】:Return Value from JDBC Transaction来自 JDBC 事务的返回值
【发布时间】:2017-10-13 17:37:07
【问题描述】:

是否可以从 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();

【问题讨论】:

    标签: postgresql jdbc transactions


    【解决方案1】:

    您可以为此使用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
    }
    

    【讨论】:

    • 或一次性ResultSet result = statement.executeUpdate("query");注意我们也可以使用executeUpdateINSERT UPDATE AND DELETE阅读更多here
    • @YCF_L:您不能将executeUpdate() 用于返回结果的查询。 Quote from the API docs:“执行给定的 SQL 语句,(...) 什么都不返回”。当您将executeUpdate() 与返回结果的查询一起使用时,Postgres 驱动程序失败并显示“预期结果未返回”。
    • 我的意思是int result = statement.executeUpdate("query"); 所以如果结果很好,那么 0 表示你执行了一个或多个语句,否则如果结果为 0 表示没有记录被更新或插入或删除,所以我没有看到任何必要使用 ResultSet
    • @YCF_L:结果集用于获取更新后 列的新值,而无需运行另一个 SELECT 语句。它根本不检查是否有更新。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-06-30
    • 2011-05-07
    相关资源
    最近更新 更多