【发布时间】:2012-12-24 16:49:49
【问题描述】:
我想要一些关于 jdbc 并发问题的建议,我基本上需要更新一个值,然后使用更新然后选择检索该值,我假设通过关闭自动提交没有其他事务可以访问此表,因此,在提交之前,其他事务将无法执行更新和选择查询。
下面是一些示例代码。你认为这会奏效吗?还有其他人有更好的解决方案来实现吗?
int newVal=-1;
con.setAutoCommit(false);
PreparedStatement statement = con.prepareStatement("UPDATE atable SET val=val+1 WHERE id=?");
statement.setInt(1, id);
int result = statement.executeUpdate();
if (result != 1) {
throw new SQLException("Nothing updated");
} else {
statement = con.prepareStatement("SELECT val FROM atable WHERE id=?");
statement.setInt(1, id);
ResultSet resultSet = statement.executeQuery();
if (resultSet.next()) {
newVal = resultSet.getInt("val");
}
}
statement.close();
con.commit();
con.setAutoCommit(true);
谢谢。
【问题讨论】:
-
别忘了关闭你的结果集!
-
如果使用JDK 7,您可以使用try with resources statement,免去关闭对象的麻烦。
-
你没有关闭第一个语句。
-
我不知道你为什么要这样做,但必须有更有效的方法来维护计数器。
-
@Peter Lawrey 可能不是最好的方法,希望有人有更好的解决方案。
标签: java mysql database jdbc concurrency