select "for update" 和 JDBC?
select "for update" with JDBC?
我想使用 JDBC 在 Java 中创建一个 for update
select 语句,但不确定如何完成。
如果您不熟悉更新,您可以在这里阅读
https://www.postgresql.org/docs/9.0/static/sql-select.html#SQL-FOR-UPDATE-SHARE
例如,我有以下 select 语句
我的select声明
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 = ?
如何在 Java 中使用 JDBC 而使用 for update
来完成?
您首先将 for update
添加到您的 select(以及您要更新的其他列),然后更新它们。另外,如评论中所述,请确保您的 getConnection
returns a 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();
}
我想使用 JDBC 在 Java 中创建一个 for update
select 语句,但不确定如何完成。
如果您不熟悉更新,您可以在这里阅读 https://www.postgresql.org/docs/9.0/static/sql-select.html#SQL-FOR-UPDATE-SHARE
例如,我有以下 select 语句
我的select声明
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 = ?
如何在 Java 中使用 JDBC 而使用 for update
来完成?
您首先将 for update
添加到您的 select(以及您要更新的其他列),然后更新它们。另外,如评论中所述,请确保您的 getConnection
returns a 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();
}