0

ある種のトランザクションを実装しようとしていますが、失敗し続けています。

これが私のコードです:

PreparedStatement ac = con.prepareStatement("UPDATE Stock "
        + "SET Stock= Stock - ('"+stockinput+"')"
        + "WHERE StockID =('"+stockID+"')");
ac.executeUpdate();
PreparedStatement dc = con.prepareStatement("SELECT StockAmount FROM Stock");
ResultSet results = dc.executeQuery();
while(results.next()){
    int temp = Integer.parseInt(results.getString("StockAmount"));
    if(stockinput < temp ){
        con.rollback();
    }
    else{
        con.commit();
    }
}

ただし、ロールバックしません。

修正を見つけるのに 1 時間近く費やしました。

誰かが私を助けてくれたら本当にありがたいです。

4

2 に答える 2

1

最初の行を忘れました。

JDBCについてもっと学ぶ必要があることをお勧めします。バインド変数を使用せずに PreparedStatement を使用するほど愚かな人がいるでしょうか?

とにかく、私はこのロジックが好きではありません。在庫量がマイナスであってはならない場合は、それをデータベースに制約として追加します。また、UPDATE を行った後に確認する必要はありません。前に確認してください。このコードはあまり意味がありません。

// i don't see this in your code.
con.setAutoCommit(false);
PreparedStatement ac = con.prepareStatement("UPDATE Stock "
        + "SET Stock= Stock - ('"+stockinput+"')"
        + "WHERE StockID =('"+stockID+"')");
ac.executeUpdate();
PreparedStatement dc = con.prepareStatement("SELECT StockAmount FROM Stock");
ResultSet results = dc.executeQuery();
while(results.next()){
    int temp = Integer.parseInt(results.getString("StockAmount"));
    if(stockinput < temp ){
        con.rollback();
    }
    else{
        con.commit();
    }
}
于 2013-06-27T01:47:13.847 に答える
0

接続を自動コミット (false) に設定します。

con.setAutoCommit(false);

準備済みステートメントの使用方法:

PreparedStatement ac = con.prepareStatement("UPDATE Stock "
        + "SET Stock= Stock - (?) "
        + "WHERE StockID = ?;
ac.setInt(1, stockinput); // setString or whatever data type
ac.setString(2, stockID);

PreparedStatements は、プリコンパイルして SQL ステートメントに格納します。このオブジェクトを使用して、このステートメントを複数回効率的に実行できます。

于 2013-06-27T02:09:44.940 に答える