2012-11-26 130 views
2

我有一個簡單的數據庫事務,如下面的代碼。第一個查詢應該正常工作,而第二個查詢應該拋出異常,因此事務不應該經過!JDBC事務不起作用

問題是,運行此代碼後,第一個查詢似乎在我的表中插入了一行,就好像它不是事務性的。代碼確實會拋出一個異常,並執行myCon.rollback();,但是新的行被插入到表中。

我不確定我錯過了什麼,任何提示將不勝感激。

- 編輯:問題是我使用默認的MyISAM引擎爲我的表。我將它改爲InnoDB,問題解決了。

Connection myCon = null; 

    try 
    { 
     Class.forName("com.mysql.jdbc.Driver"); 
     myCon = DriverManager.getConnection (dbUrl, dbUser, dbPass); 

     myCon.setAutoCommit(false); // the intention is to do a transaction 

     Statement stmt = myCon.createStatement(); 

     String query = "INSERT INTO tbltest(f1) VALUES (1);"; 
     stmt.executeUpdate(query); 

     query = "INSERT INTO"; // a malformed query 
     stmt.executeUpdate(query); 

     con.commit(); 
    } 
    catch(Exception e) 
    { 
     System.err.println(e.toString()); 
     myCon.rollback(); 
    } 
    finally 
    { 
     myCon.close(); 
    } 
+0

你可以在你的代碼後編輯錯誤信息嗎?順便說一下,用e.printStackTrace();'not'e.toString();'可以更好地進行調試。 – durron597

回答

5

您的MySQL數據庫必須設置爲支持這樣的事情。我相信這意味着每個表的InnoDB。你的情況是這樣嗎?如果沒有,創建InnoDB表並重試。

http://dev.mysql.com/doc/refman/5.0/en/commit.html

+0

非常感謝,它是MyISAM,將它更改爲InnoDB並且它工作正常! – Abbas

5
什麼的MySQL引擎您使用的

? AFAIK,一些引擎(例如MyISAM)不支持事務。 InnoDB的確如此。

+0

你是對的,這是MyISAM,我將它改爲InnoDB,它工作正常! – Abbas