2013-06-27 60 views
0

我想實現某種事務並保持失敗。在Java中的MySQL事務

這裏是我的代碼:

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

你忘了第一行。

我建議您需要了解更多關於JDBC的知識。誰會愚蠢到使用PreparedStatement而不使用綁定變量?

反正我不喜歡這個邏輯。如果股票數量不應該是負數,那麼我會將其作爲數據庫中的一個約束添加。爲什麼在你完成更新後檢查?檢查前。這段代碼沒什麼意義。

// 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(); 
    } 
} 
+0

仍然不起作用:(我把這段代碼放在try {}塊的開頭 – user2525364

0

將連接設置爲autocommit(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); 

預處理語句預編譯並存儲在SQL語句中。然後可以使用此對象多次高效地執行此語句。