我正在尝试在 JDBC 中实现一个计数器,该方法本质上是增加一个列值并返回新的列值,下面是我的代码片段我首先执行 select .. for update 以获取旧值(也导致一行lock) 然后对该行执行更新。我是否可以假设没有其他事务可以干扰 select .. for update 然后更新之间的列 val 的值。
//get connection here
con.setAutoCommit(false);
PreparedStatement statement = con.prepareStatement("SELECT val FROM atable WHERE id=? FOR UPDATE");
statement.setInt(1, id);
ResultSet resultSet = statement.executeQuery();
if (resultSet.next()) {
oldVal = resultSet.getInt("val");
statement = con.prepareStatement("UPDATE atable SET val=" + oldVal + "+1 WHERE id=?");
statement.setInt(1, id);
int result = statement.executeUpdate();
if (result != 1) {
throw new SQLException("error message");
} else {
newVal = oldVal + 1;//could do another select statement to get the new value
statement.close();
}
} else {
throw new SQLException("error message");
}
resultSet.close();
con.commit();
con.setAutoCommit(true);
//close connection here
谢谢。