日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > java >内容正文

java

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

發布時間:2024/9/27 java 36 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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开始的地方重新走一次流程?...的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。