BaseServlet.class
BaseServlet.class
分发至子类OrderServlet.class
的submitOrder()
方法submitOrder()
调用Service层的submitOrder()
方法.submitOrder()
中使用了事务回滚. 这里调用了Dao
层两个方法: fun01()
和fun02()
, 其中fun01
执行成功, fun02()
执行时抛出异常.BaseServlet
。dao
层的插入数据的方法吗?这个异常, 导致回滚技术无法实现呀.
public String submitOrder(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
...
Debug.log("进入方法:submitOrder..."); // 打印信息
boolean flag = false;
// 调用service层方法
flag = orderService.submitOrder( pids, checkeds, quantitys, user );
// 提交成功 --> order_info.jsp页面 失败 --> info.jsp
if( flag ) {
return goOrderInfoUI(req, resp);
}else {
req.setAttribute("error", "提交订单失败!");
return "/info.jsp";
}
}
...
// 获得*线程绑定的连接*
Connection conn = null;
try {
conn = C3P0Util.getConnection();
Debug.log("连接=="+conn);
// 开启事务
// 由于插入要么都成功, 要么都失败, 所以需要用事务操作
Debug.log("进入try");
conn.setAutoCommit(false);
Debug.log("开启事务");
// 调用dao插入数据库
// 插入订单
orderDao.insertOrder(order);
Debug.log("order插入走完");
// 插入订单项
orderDao.insertOrderItmes( orderItems );
// 提交事务
conn.commit();
// 方法返回值为true
Debug.log("事务已提交");
flag = true;
}catch(Exception e) {
Debug.log("进入外层catch");
// 回滚事务
try {
conn.rollback();
Debug.log("事务已回滚");
} catch (SQLException e1) {
// TODO Auto-generated catch block
Debug.log("进入内存catch");
e1.printStackTrace();
}
}finally {
// 关闭连接
try {
Debug.log("关闭连接");
conn.close();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
Debug.log("service走完");
return flag;
...
注:Debug.log()
是自定义方法用来打印信息.
个人觉得servlet走第二次流程和事务回滚没有关系;
应该是你多次访问servlet导致的