JDBC でカウンターを実装しようとしています。このメソッドは基本的に列の値をインクリメントし、新しい列の値を返します。以下は私のコードのスニペットです。最初に select .. for update を実行して古い値を取得します (行もロック) 次に、その行で更新を実行します。select .. for update と 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
ありがとう。