2

我有一个简单的数据库事务,如下面的代码。第一个查询应该可以正常工作,而第二个应该抛出异常,因此事务不应该通过!

问题是,运行此代码后,第一个查询似乎在我的表中插入了一行,就好像它不是事务性的一样。该代码确实会引发异常并被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();
    }
4

2 回答 2

5

您的 MySQL 数据库必须设置为支持这样的事情。我相信这意味着每个表的 InnoDB。你的情况是这样吗?如果没有,请创建 InnoDB 表并重试。

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

于 2012-11-26T23:41:10.033 回答
5

您使用的是什么 MySql 引擎?AFAIK,某些引擎(例如 MyISAM)不支持事务。InnoDB 可以。

于 2012-11-26T23:42:48.440 回答