java servlet 事务_Java在触发事务回滚之后为什么会再一次回到Servlet开始的地方重新走一次流程?...

代码流程

前台点击"提交订单"进入BaseServlet.class

BaseServlet.class分发至子类OrderServlet.class的submitOrder()方法

submitOrder()调用Service层的submitOrder()方法.

关键是Service层submitOrder()中使用了事务回滚. 这里调用了Dao层两个方法: fun01()和fun02(), 其中fun01执行成功, fun02()执行时抛出异常.

catch到异常后, 执行回滚. 然后关闭连接.

然后, 异常诡异的是, 程序并没有在回滚、关闭连接后结束,而是再一次进入BaseServlet。

再一次执行一次上述流程,而这一次,由于第一次已经将线程绑定的连接关闭了。所以自然出现异常:不能操作已经关闭的连接。

我的疑惑是:为什么它走了两次这个流程?是因为我调用了个dao层的插入数据的方法吗?

还是或事物回滚就是从头在执行要一遍流程呢?

这个异常, 导致回滚技术无法实现呀.

代码片段(图片)

084a4053042fd5f17e2abe2cd121879d.png

代码片段源码

Servlet层

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";

}

}

service层

...

// 获得*线程绑定的连接*

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()是自定义方法用来打印信息.

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值