java - JDBC 事务不工作

标签 java jdbc transactions

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

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

最佳答案

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

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

关于java - JDBC 事务不工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13575040/

相关文章:

postgresql - postgreSQL 服务器中的连接尝试失败

asp.net - 事务的 SQL 错误超时

Spring事务——检测回滚和提交

java - 使用php将base64图像从android上传到服务器时出错

java - 快速生成随机列元素的方法

java - RMI理解问题

database - Prolog:类似事务的功能?

java - 递归过程中的第一个过程调用发生堆栈溢出

java - 获取事务中自增字段的值

scala - 在 Play 中以非阻塞方式使用 JDBC 有哪些选项?