请问大家,这是一个程序的片段:
private void startExport() throws Exception {
// 得到所有已经完成录入的XML文件名列表
Vector v = LocalImage.getUpLoadToRemoteDBList(FETCHNUM);
int success = 0;
UploadServiceServer.getLogger().debug("需要上传数据共有" + v.size() + "个"); try {
for (int i = 0; i < v.size(); i++) {
LocalImage localImage = (LocalImage) v.get(i);
int retNo = export2DB(localImage);// 倒入到远程数据库中 是DB2数据库
//TODO magic number,需要优化 陈耀辉
if(retNo==1){
localImage.completeUpload("3", "4");// 更新本地库 是sql数据库 localimage是一个表
success++;
}
}

} catch (Exception e) {
// TODO 自动生成 catch 块
e.printStackTrace();
UploadServiceServer.getLogger().debug("上传数据出现错误,异常信息:" + e.getMessage());
}
System.out.println("成功上传了" + success + "个数据");
UploadServiceServer.getLogger().debug("成功上传了" + success + "个数据");
}
现在出现下面的错误:
 [DEBUG] 2008-10-27 16:56:46,375 method:com.sunyard.bpo.push.UploadDataToRemoteDB.startExport(UploadDataToRemoteDB.java:146)
上传数据出现错误,异常信息:[Microsoft][SQLServer 2000 Driver for JDBC][SQLServer]Transaction (Process ID 57) was deadlocked on lock resources with another process and has been chosen as the deadlock victim. Rerun the transaction.
[DEBUG] 2008-10-27 16:56:46,375 method:com.sunyard.bpo.push.UploadDataToRemoteDB.startExport(UploadDataToRemoteDB.java:149)
成功上传了1个数据
请问这是sql中的localimage表被锁住啦吗,该怎么解决啊,谢谢大家啦

解决方案 »

  1.   

    是被锁住了,看你这段程序没有解决办法,要看你操作数据库的方法localImage.completeUpload,才能知道你操作数据库的时候出了什么问题
      

  2.   

    public void completeUpload(String beforeState,String afterState) throws Exception {
    DBConnection dbCon = null;//注释:保全可能要加上NOTE1.
    int updateNo = 0;
    try { dbCon = DBUtil.createLocalDBConnection(); // 查询
    String sSQL = " update  LocalImage set STATE='" + afterState + "',UPLOADTIME = GETDATE() where BATCHCODE ='"
    + BATCHCODE
    + "' and PLCYNUM  ='"
    + PLCYNUM
    + "' and STATE='" + beforeState + "'";
    Statement statement = dbCon.createStatement();
    updateNo = statement.executeUpdate(sSQL);
    statement.close();
    if(updateNo!=1){
    throw new Exception("更新本地库失败!批次号:" + BATCHCODE + ",保单号:" + PLCYNUM);
    }
    } catch (Exception e) {
    throw e;
    } finally {
    DBUtil.removeConnection();
    }}
    这就是上面方法的代码
      

  3.   

    DBUtil.removeConnection(); 
    估计是你的这个方法有问题,只是关闭连接,但是没有标示是关闭哪一个连接。
    比如两个操作数据库的方法,分别打开了连接1和连接2,连接1和连接2同时进行数据库操作,这个时候连接2先结束了,调用方法关闭连接,由于没有指定是哪个连接,可能会把连接1给关掉了。但是这个时候方法1还需要连接进行操作,这个时候就没法正常提交就会报错了。
      

  4.   

    是不是用同一个connect对象用事务控制下,如果错误,全部执行回滚