日期:2014-05-19  浏览次数:20711 次

java数据库操作方法是否要加线程锁
/**
 * 执行无返回值的SQL语句
 */
public int executeUpdate(String sql, Object[] obj) throws SQLException {
int ri = 0;
try {
pstm = con.prepareStatement(sql);
for (int i=0; i<obj.length; i++) {
pstm.setObject(i+1, obj[i]);
}
ri = pstm.executeUpdate();
} catch (Exception e) {
log.error("执行"+sql+"出错!", e);
e.printStackTrace();
} finally {
baseConnect.backConnection(con);
}
return ri;
}

上面这方法可以添加、修改和删除记录这个方法是不是要加“synchronized”呢
如果不加,会不会出现同时两个用户一个在修改,而另一个已经将此记录删除掉了,产生修改出错呢?求解答!!!
------最佳解决方案--------------------
确保每个线程使用独立的Connection就够了。

至于你说的:“会不会出现同时两个用户一个在修改,而另一个已经将此记录删除掉了,产生修改出错呢?”
跟并发无关,即便都是串行执行,也会存在这种风险;修改出错并不会导致数据不一致之类的问题,只不过就是个修改失败而已,所以根本不是问题。
------其他解决方案--------------------
每个用户一个可能也不能完全解决,看情况pstmt是全局的,每个线程都需要创建新的这个对象应该就没问题了
------其他解决方案--------------------
在你没有配置数据库连接池的情况下,每一次的连接都是新new出来的,连接对象都是不同
------其他解决方案--------------------
public synchronized Connection getConnection(){
//从连接池中获取方法
}

从连接池中获取连接是加锁的
这样符合1楼说的“每个线程使用独立的Connection”
------其他解决方案--------------------
引用:
确保每个线程使用独立的Connection就够了。

至于你说的:“会不会出现同时两个用户一个在修改,而另一个已经将此记录删除掉了,产生修改出错呢?”
跟并发无关,即便都是串行执行,也会存在这种风险;修改出错并不会导致数据不一致之类的问题,只不过就是个修改失败而已,所以根本不是问题。

其实我还是担心他说的下面的一部分,现在看来担心对于了
------其他解决方案--------------------
楼主这个同步不是你考虑的范围哦,这个是数据库的事务和JDBC去控制的