最近一个项目发生了奇怪的问题,我们的项目是个产品形式的,部署到其他客户那都没问题,但单独这个客户出现了经常锁表,各种方法都试了也没能处理得了,现描述下环境贴一下代码java 6.0 + tomcat 6.0+oracle11g + server 2008 + spring 3.2.9
public ExcuteResult uploadPhotoForApp(Map<String,String> reqParams,
Map<String, MultipartFile> files){
Date dt = new Date();
boolean isCommit = false;
boolean isSavePhotoSuccess = false;
ExcuteResult result = new ExcuteResult();
List<Map<String,String>> imagePathList = null;
Map<String,Object> params = new HashMap<String,Object>();
params.putAll(reqParams);
params.put("createTime", dt);
params.put("photoFrom", "0"); //图片来源
params.put("transOrderCode", reqParams.get("transOrderNo"));
//userCode查询车辆的相关信息
String type = reqParams.get("onlineType");
String userCode =  reqParams.get("userCode");
String tdon = reqParams.get("transOrderDetailNo");
String transOrderNo = reqParams.get("transOrderNo");
Map<String,String> sleParams = reportCarMapper.selectByUsercode(userCode);
params.put("carCode", sleParams.get("carCode"));
params.put("carNo", sleParams.get("carNo"));
params.put("pX", params.get("px"));
params.put("pY", params.get("py"));
params.put("pName", params.get("pname"));
//图片保存到本地
try {
imagePathList = saveArivalPhotoForApp(files,params);
isSavePhotoSuccess = imagePathList != null && imagePathList.size() > 0;
} catch (Exception e) {
e.printStackTrace();
}
//处理数据库
synchronized (this) {//并发处理
int updateNum = 0 ;
TransactionStatus ts = manager.getTransaction(new DefaultTransactionDefinition());

try {
if(type != null && type.equals("nomal")) {//特殊上传
//修改线下单据的状态
CCarrierPo auth  = new CCarrierPo();
auth.setCreateTime(dt);
auth.setTdon(tdon);
isCommit = CorderListDao.updateArrival(auth) > 0;//更新到货状态
}else if(files.containsKey("arrivalPhoto")){
CCarrierPo auth  = new CCarrierPo();
auth.setTdon(tdon);
auth.setCreateTime(new Date());
auth.setTransCode(transOrderNo);
int count = CorderListDao.updateArrival(auth);
if(count > 0 ) {
count = orderListDao.updateTeOrderCode(auth);
//2. 修改车辆状态与用户的状态为 '空闲'
//根据运输单号查询司机与车辆的状态,将车辆与司机状态至为空闲的状态
if(orderListDaoZooid.updateTranNoStaus(transOrderNo) > 0){
//2.2成功之后更新车辆的状态以及司机的成功状态
//先锁定车标,更新
TTransOrderDetail tg = orderListDaoZooid.selectTTransOrderDetai(transOrderNo);
reqParams.put("carCode", tg.getCarCode());
selectForUpdateMapper.selectTCarforUpdate(reqParams);
updateNum = orderListDaoZooid.updateCarcode(tg.getCarCode());
updateNum =  updateNum + orderListDaoZooid.updateUsercode(tg.getUserCode());
}
}
isCommit = updateNum >= 2;
}else{
isCommit = true;
}
int res = 0;
for(Map<String,String> item : imagePathList){//保存上传成功的照片
params.putAll(item);
res = res + appDao.insertGoodTransOrderPhoto(params);
}
ServiceExcuteResult ser = insertPhotoLocation(params,userCode);
if(isCommit && res > 0 && ser.isSuccess() && isSavePhotoSuccess){//修改状态,保存轨迹和上传图片均成功
result.success();
manager.commit(ts);
}else{
manager.rollback(ts);
}
} catch (Exception e) {
manager.rollback(ts);
e.printStackTrace();
}
}
return result;
}
锁表 都是在   appDao.insertGoodTransOrderPhoto(params); 这行不是百分百,是很大几率锁忘大神们能出手相助帮忙分析问题,感激不尽