前提・実現したいこと
サーブレットとJSPを用いてショッピングカート風機能を作っています。
注文確認画面から終了画面に遷移する際、サーブレットでは在庫を減らす更新処理等が動いています。
MySQL(ワークベンチ)から直接在庫を0にしてみたら、遷移の際にエラーはどのように働くのか確認したいです。
発生している問題・エラーメッセージ
- トランザクションを用いて、エラーが起きたらロールバックし、メッセージを出すようにしています
- SQLから在庫を0にしてエラーを促しても、終了画面に遷移してしまいます
- データベースを見ると0にする前の在庫から注文数が引かれた状態に更新されていました
該当のソースコード
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { //パラメーター取得 request.setCharacterEncoding("UTF-8"); String[] itemId=request.getParameterValues("itemId"); String[] price=request.getParameterValues("price"); String[] numbr = request.getParameterValues("numbr"); String[] stock = request.getParameterValues("stock"); String userId = (String) request.getSession(false).getAttribute("userId"); try { //DB接続 ConnectionDb db = new ConnectionDb(); db.conn(); try { // 自動コミットを解除する(トランザクション開始) db.con.setAutoCommit(false); //商品一行ずつ情報を更新 String[] row = request.getParameterValues("itemId"); int i = 0; while (i< row.length) { //SQL 挿入 String query = "INSERT INTO ORDER " + "(CUSTOMER_ID,ITEM_ID,NUMBER,PRICE,UPD_STAF_CD,UPD_DATE,INS_DATE,DEL_FLG) " + "VALUES (?,?,?,?,?,NOW(),NOW(),0) "; //SQL実行 PreparedStatement stmt = db.con.prepareStatement(query); stmt.setString(1,userId); stmt.setString(2,itemId[i]); stmt.setString(3,numbr[i]); stmt.setString(4,price[i]); stmt.setString(5,userId); stmt.executeUpdate(); i++; } int ii = 0; while (ii< row.length) { //在庫から注文数を減らす int num = Integer.parseInt(stock[ii]) - Integer.parseInt(numbr[ii]); //SQL 更新 String query2 ="UPDATE PRODUCT_STOCK " + "SET STOCK = ?,UPD_STAF_CD = ?, UPD_DATE = NOW() " + "WHERE ITEM_ID = ? "; //Excecute SQL PreparedStatement stmt2 = db.con.prepareStatement(query2); stmt2.setInt(1,num); stmt2.setString(2,userId); stmt2.setString(3,itemId[ii]); stmt2.executeUpdate(); ii++; } // コミット db.con.commit(); } catch (Exception e) { // ロールバック db.con.rollback(); System.out.println("connectionTest_NG"); throw e; } finally { if (db.con != null) { db.con.close(); } //終了画面へ遷移 RequestDispatcher dispatcher = request.getRequestDispatcher("/WEB-INF/end.jsp"); dispatcher.forward(request, response); } } catch (SQLException e) { e.printStackTrace(); } } }
イメージ画像
回答1件
あなたの回答
tips
プレビュー