java程序回滚之后在哪看_Java在触发事务回滚之后为什么会再一次回到Servlet开始的地方重新走一次流程?...
代碼流程
前臺點擊"提交訂單"進入BaseServlet.class
BaseServlet.class分發至子類OrderServlet.class的submitOrder()方法
submitOrder()調用Service層的submitOrder()方法.
關鍵是Service層submitOrder()中使用了事務回滾. 這里調用了Dao層兩個方法: fun01()和fun02(), 其中fun01執行成功, fun02()執行時拋出異常.
catch到異常后, 執行回滾. 然后關閉連接.
然后, 異常詭異的是, 程序并沒有在回滾、關閉連接后結束,而是再一次進入BaseServlet。
再一次執行一次上述流程,而這一次,由于第一次已經將線程綁定的連接關閉了。所以自然出現異常:不能操作已經關閉的連接。
我的疑惑是:為什么它走了兩次這個流程?是因為我調用了個dao層的插入數據的方法嗎?
還是或事物回滾就是從頭在執行要一遍流程呢?
這個異常, 導致回滾技術無法實現呀.
代碼片段(圖片)
代碼片段源碼
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()是自定義方法用來打印信息.
總結
以上是生活随笔為你收集整理的java程序回滚之后在哪看_Java在触发事务回滚之后为什么会再一次回到Servlet开始的地方重新走一次流程?...的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: java spring 多数据库_jav
- 下一篇: oracle fs1 2多少u,甲骨文F