日期:2014-05-20  浏览次数:20870 次

求教JDBC事务控制,为什么没有回滚?
Java code
Connection conn = null;
        PreparedStatement pstmt = null;
        try {
            conn = DriverManager.getConnection(XXX,XXX,XXX);
            conn.setAutoCommit(false);
            [color=#FF0000]pstmt = conn.prepareStatement("INSERT INTO XXXX");//执行插入操作 1[/color]
            pstmt.addBatch();
                        //省略中间代码
                        [color=#FF0000]pstmt.addBatch(sql1);//执行修改操作 2[/color]
                        pstmt.addBatch(sql2);//执行修改操作
                        pstmt.addBatch(sql3);//执行修改操作
            pstmt.executeBatch();
            conn.commit();
        } catch (Exception e) {
            e.printStackTrace();
            try {
                if (conn != null){
    [color=#FF0000]                conn.rollback();//此处被调用 3[/color]
                }
            } 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处代码被执行并且没有异常,执行了回滚操作,但是为什么数据还是被插入数据库了,求教?

------解决方案--------------------
mysql数据库新表默认不支持事务。
------解决方案--------------------
探讨

引用:

mysql数据库么?
是mysql

------解决方案--------------------
show variables like 'have_%'
看看有没有have_innodb
确定你的表type是InnoDB?
MySQL中只有InnoDB和BDB支持事务

哎,mysql这种免费的东西...好久好久没用了,的确各方面都达不到我的要求诶
现在要么商业应用就用用MSSQL,简单应用就上SQLITE了,这东西还不错
------解决方案--------------------
如果不是批量操作呢?只插一条试试看回不回滚。。如果插一条没问题的话,估计就是批量的问题了,偶没试过。。