您首先將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();
}
'conn.setAutoCommit = false'是'for update'鎖有效的必要條件,還是沒有關係? –
另外,'createStatement'不需要用'ResultSet.CONCUR_UPDATABLE'來調用,所以'updateRow'可以工作嗎? –
@GordThompson很好,謝謝。是啊。這是晚餐時間,我有點匆忙。 –