第一次靠自己慢慢解决问题,再此做做笔记,各位大牛请多多指教。
先来描述问题,我的逻辑层里面包含多次对DB的操作
初次代码如下:
@Override
public int register(UserInfo userInfo, CarInfo carInfo) {
log.info("register() enter");
try {
sqlDao.create("CarInfo.insert", carInfo);
sqlDao.create("UserInfo.insert", userInfo);
UserCarInfo userCarInfo = new UserCarInfo();
userCarInfo.setId(SerialNo.getSmallUNID());
userCarInfo.setOpenId(userInfo.getOpenId());
userCarInfo.setUserInfoId(userInfo.getId());
userCarInfo.setCarInfoId(carInfo.getId());
return sqlDao.create("UserCarInfo.insert",userCarInfo);
} catch (Exception e) {
log.info("注册时异常",e);
return 1;
}
}
修改后代码:
@Override
public int register(UserInfo userInfo, CarInfo carInfo) {
log.info("register() enter");
try {
sqlDao.create("CarInfo.insert", carInfo);
sqlDao.create("UserInfo.insert", userInfo);
UserCarInfo userCarInfo = new UserCarInfo();
userCarInfo.setId(SerialNo.getSmallUNID());
userCarInfo.setOpenId(userInfo.getOpenId());
userCarInfo.setUserInfoId(userInfo.getId());
userCarInfo.setCarInfoId(carInfo.getId());
return sqlDao.create("UserCarInfo.insert",userCarInfo);
} catch (Exception e) {
log.info("注册时异常",e);
throw new RuntimeException("注册时异常", e);
}
}
总结问题:初始代码,捕获了异常并吃掉了,导致spring以为不存在异常,所以它的事务处理没有起作用;
修改代码后将异常抛出,spring的事务处理起作用。
另外分享一个关于异常处理的链接: http://www.ibm.com/developerworks/cn/java/j-lo-exception-misdirection/