事务提交过程,出现异常,但是回滚事务失败,这是什么原因

/**
*实现事务:Tom 对Jerry 转账500元
*
*/
public class TransactionTest {

public static void update(Connection conn,String sql,Object ... args){
    PreparedStatement pstmt = null;
    try{
        pstmt = conn.prepareStatement(sql);//通过SQL语句 创建PreparedStatement 对象。

        //利用 for 循环对 SQL 语句中的 PreparedStatement 占位符 ,更新数据。
        for(int i = 0;i < args.length;i++){
            pstmt.setObject((i+1), args[i]);
        }
        //更新执行。
        pstmt.executeUpdate();

    }catch(Exception e){
        e.printStackTrace();
    }finally{
        //关闭数据库连接。
        JDBCTools.release(null, pstmt, null);
    }
}

public static void main(String[] args) {
    Connection conn = null;

    try{
        conn = JDBCTools.getConnection();

        //取消默认的提交方式
        conn.setAutoCommit(false);

        String sql = "UPDATE user SET balance = balance - 500 WHERE id = 2000001";
        update(conn, sql);

/*此处会 报com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException,Table 'ming.users' doesn't exist
但是,整个事务却没有回滚。*/

        sql = "UPDATE users SET balance = balance + 500 WHERE id = 2000002";
        update(conn,sql);

        //若事务操作正常,则提交事务
        conn.commit();

    } catch(Exception e){
        //若事务操作出现异常,则需要在异常处理中回滚事务
        try {
            conn.rollback();
        } catch (SQLException e1) {
            e1.printStackTrace();
        }
        e.printStackTrace();
    } finally{
        JDBCTools.release(null, null, conn);
    }
}

}

我刚才写了一些代码,自己建了一个数据库表usertable,字段为id,name,进行了测试。
我先在你的代码中加入一些文字说明。好看出代码运行的地方。
图片说明
图片说明
更新成功的结果如下:
图片说明
更新失败的结果如下(当然,我是故意设置和你一样异常的结果,即找不到该数据库表):
图片说明
结果表明,无论成功或是失败,都执行了提交操作。
后来我将你的update方法注释掉,并将其具体代码放在了main方法中,如下图。
图片说明
结果就成功了。
图片说明
我猜想是你的update方法已经对该方法可能出现的异常做出了异常处理,所以对于Main函数的try就无法捕获异常,所以就认为是没有问题的,就一直这么执行下去了。
这个我也是想了挺久的,不知道有没有想对,但愿对你有帮助。

报的语法错误,(user表能创建?)users表不存在,批量处理用addbatch()吧?这样才体现整体性

可能第二个sql语句中表users不存在,没法回滚!

如果对你有帮助,就回复我一声呗。我刚在这里回答问题不久,基本回答了就没有回应,所以不知道这样做有没有用。

图片说明](https://img-ask.csdn.net/upload/201701/18/1484670149_116611.png)

图片说明

图片说明