Connection conn = null;
PreparedStatement pstmt = null;
try {
conn = DriverManager.getConnection(XXX,XXX,XXX);
conn.setAutoCommit(false);
pstmt = conn.prepareStatement("INSERT INTO XXXX");//执行插入操作 1
pstmt.addBatch();
                        //省略中间代码
                        pstmt.addBatch(sql1);//执行修改操作 2
                        pstmt.addBatch(sql2);//执行修改操作
                        pstmt.addBatch(sql3);//执行修改操作
pstmt.executeBatch();
conn.commit();
} catch (Exception e) {
e.printStackTrace();
try {
if (conn != null){
conn.rollback();//此处被调用 3
}
} catch (SQLException e1) {
e1.printStackTrace();
}
}finally{
if(pstmt != null)
try {
pstmt.close();
} catch (SQLException e) {
e.printStackTrace();
pstmt = null;
}
if(conn != null)
try {
conn.close();
} catch (SQLException e) {
e.printStackTrace();
conn = null;
}
}
标记2出错,标记1插入的数据仍然进入数据库,调试跟踪发现标记3处代码被执行并且没有异常,执行了回滚操作,但是为什么数据还是被插入数据库了,求教?

解决方案 »

  1.   

    mysql数据库新表默认不支持事务。
      

  2.   

    看一下你表的的类型,是不是MyISAM 这个类型不支持事务的,需要用InnoDB类型
      

  3.   

    整个try-catch结构算是一行代码。。不需要花括号
      

  4.   


    mysql>  set autocommit=0;
            select * from test;
            insert into test values (1,'a');
            select * from test;
            commit;
            select * from test;
            set autocommit=0;
            insert into test values(2,'b');
            select * from test;      
            rollback;
            select * from test;Query OK, 0 rows affectedEmpty setQuery OK, 1 row affected+----+------+
    | id | name |
    +----+------+
    |  1 | a    |
    +----+------+
    1 row in setQuery OK, 0 rows affected+----+------+
    | id | name |
    +----+------+
    |  1 | a    |
    +----+------+
    1 row in setQuery OK, 0 rows affectedQuery OK, 1 row affected+----+------+
    | id | name |
    +----+------+
    |  1 | a    |
    |  2 | b    |
    +----+------+
    2 rows in setQuery OK, 0 rows affected+----+------+
    | id | name |
    +----+------+
    |  1 | a    |
    |  2 | b    |
    +----+------+
    2 rows in set这是我测试的,貌似确实是不支持事务
      

  5.   

    show variables like 'have_%'
    看看有没有have_innodb
    确定你的表type是InnoDB?
    MySQL中只有InnoDB和BDB支持事务哎,mysql这种免费的东西...好久好久没用了,的确各方面都达不到我的要求诶
    现在要么商业应用就用用MSSQL,简单应用就上SQLITE了,这东西还不错
      

  6.   

    参考网上一些资料修改my.ini现在是支持事务了
    mysql> set autocommit=0;select * from test;insert into test values(3,'c');select * from test;rollback;select * from test;
    Query OK, 0 rows affected+----+------+
    | id | name |
    +----+------+
    |  1 | a    |
    +----+------+
    1 row in setQuery OK, 1 row affected+----+------+
    | id | name |
    +----+------+
    |  1 | a    |
    |  3 | c    |
    +----+------+
    2 rows in setQuery OK, 0 rows affected+----+------+
    | id | name |
    +----+------+
    |  1 | a    |
    +----+------+
    1 row in set
    但是我的代码里边事务还没没能回滚,感觉代码也没什么问题啊
      

  7.   

    mysql InnoDB 支持事务回滚。
      

  8.   

    没人知道么?高手呢?数据库是支持事务的,但是我的代码走调用了rollBack却没能回滚