質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

SQL

SQL(Structured Query Language)は、リレーショナルデータベース管理システム (RDBMS)のデータベース言語です。大きく分けて、データ定義言語(DDL)、データ操作言語(DML)、データ制御言語(DCL)の3つで構成されており、プログラム上でSQL文を生成して、RDBMSに命令を出し、RDBに必要なデータを格納できます。また、格納したデータを引き出すことも可能です。

servlet

Servletとは、Webページの動的な生成やデータ処理などをサーバ上で実行するために、Javaで作成されたプログラムです。 ショッピングサイトやオンラインバンキングといった、動的なウェブサイトの構築に用いられています。

Q&A

解決済

1回答

1561閲覧

更新処理中にエラーが起きたらエラー画面をだしたい

poporian_a

総合スコア8

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

SQL

SQL(Structured Query Language)は、リレーショナルデータベース管理システム (RDBMS)のデータベース言語です。大きく分けて、データ定義言語(DDL)、データ操作言語(DML)、データ制御言語(DCL)の3つで構成されており、プログラム上でSQL文を生成して、RDBMSに命令を出し、RDBに必要なデータを格納できます。また、格納したデータを引き出すことも可能です。

servlet

Servletとは、Webページの動的な生成やデータ処理などをサーバ上で実行するために、Javaで作成されたプログラムです。 ショッピングサイトやオンラインバンキングといった、動的なウェブサイトの構築に用いられています。

0グッド

0クリップ

投稿2020/05/22 04:47

編集2020/05/24 08:26

前提・実現したいこと

サーブレットと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(); } } }

イメージ画像

イメージ説明

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2020/05/24 06:26

MySQL Workbench は java から起動するものではありません。 よって「MySQL Workbench」タグはなぜついてますか?
poporian_a

2020/05/24 08:26

仰る通りです。テーブルを直接いじる際にワークベンチから手を加えていたので、いちよタグをつけておこう、という意思でつけていました。消しておきます。
guest

回答1

0

ベストアンサー

結論

(質問者が期待するような)エラーは発生しません。

原因

更新処理時に在庫をチェックする仕組みが実装されていない。
更新処理の手前の画面では在庫があったが更新処理時には在庫が足りなくなった(直接DBを操作して在庫を0にしたのはこのテストのためでしょう)ケースをエラーにしたいなら、更新処理時に在庫を確認しなければならない。
アプリ側では手前の画面で計算した最終的な在庫(num)をそのままupdateしているため、その直前で在庫を0にしてやっても更新処理でnumがそのまま在庫になるため意味がない。
もしupdateとワークベンチからの在庫0処理が同時に発生しても、先に実行したトランザクションの終了待ちになるので結局エラーは発生しない。

更新処理前にワークベンチで在庫0にする際、トランザクションを有効にしてコミットせず放置し、更新処理を実行すればタイムアウトでエラーが起きるかもしれません。(永遠にコミット待ちになる可能性もあります)

いずれにせよ、更新時に在庫チェックをちゃんと実装しないとアカンですよ。

投稿2020/05/25 12:31

hope_mucci

総合スコア4447

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

poporian_a

2020/05/25 23:53

回答誠にありがとうございます!初心者の私でもわかりやすかったです。 なお、回答者様の仰る通りで、最終チェックの先輩からは実装すればエラーになるけれど、今回はここまででいいよと言われていました。そのまま放置することにしたのですが、せっかく回答をいただけたので、時間を作ってやってみようと思います。ありがとうございました!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問