2

我想for update使用 JDBC 在 Java 中创建一个 select 语句,但不确定如何完成。

如果您对更新不熟悉,可以在这里阅读 https://www.postgresql.org/docs/9.0/static/sql-select.html#SQL-FOR-UPDATE-SHARE

例如,我有以下选择语句

我的选择语句

select email from email_accounts where already_linked = false order by random() limit 1

我的更新声明

UPDATE email_accounts set already_linked = true, account_link_timestamp = now() where email = ?

在使用 JDBC 时如何在 Java 中完成此操作for update

4

1 回答 1

11

您首先添加for update到您的选择(以及您要更新的其他列),然后更新它们。此外,如评论中所述,请确保您getConnection返回Connection没有自动提交。并且您需要设置Statement滚动类型和CONCUR_UPDATABLE. 就像是,

String[] colNames = { "email", "already_linked", "account_link_timestamp" };
String query = "select " + Stream.of(colNames).collect(Collectors.joining(", "))
        + "from email_accounts where already_linked = false for update";
try (Connection conn = getConnection(); // Make sure conn.setAutoCommit(false);
        Statement stmt = conn.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE, 
                ResultSet.CONCUR_UPDATABLE);
        ResultSet rs = stmt.executeQuery(query)) {
    while (rs.next()) {
        // Get the current values, if you need them.
        String email = rs.getString(colNames[0]);
        boolean linked = rs.getBoolean(colNames[1]);
        Timestamp time = rs.getTimestamp(colNames[2]);
        // ...
        rs.updateBoolean(colNames[1], true);
        rs.updateTimestamp(colNames[2], //
                new Timestamp(System.currentTimeMillis()));
        rs.updateRow();
    }
} catch (SQLException e) {
    e.printStackTrace();
}
于 2017-10-28T22:56:36.300 回答