ming_2017 2017-01-15 15:57 采纳率: 33.3%
浏览 11120
已采纳

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

/**
*实现事务: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);
    }
}

}

  • 写回答

6条回答 默认 最新

  • 奔跑的小猪 2017-01-16 03:23
    关注

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

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(5条)

报告相同问题?

悬赏问题

  • ¥15 用matlab 设计一个不动点迭代法求解非线性方程组的代码
  • ¥15 牛顿斯科特系数表表示
  • ¥15 arduino 步进电机
  • ¥20 程序进入HardFault_Handler
  • ¥15 oracle集群安装出bug
  • ¥15 关于#python#的问题:自动化测试
  • ¥20 问题请教!vue项目关于Nginx配置nonce安全策略的问题
  • ¥15 教务系统账号被盗号如何追溯设备
  • ¥20 delta降尺度方法,未来数据怎么降尺度
  • ¥15 c# 使用NPOI快速将datatable数据导入excel中指定sheet,要求快速高效