2012-11-26 55 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