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

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

/**
*实现事务: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 无用
    打赏 举报
  • 易大师不易 2017-01-16 01:28

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

    评论
    解决 无用
    打赏 举报
  • yh1276 2017-01-16 01:29

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

    评论
    解决 无用
    打赏 举报
  • 奔跑的小猪 2017-01-16 07:29

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

    评论
    解决 无用
    打赏 举报
  • ming_2017 2017-01-17 16:22
    评论
    解决 无用
    打赏 举报
  • ming_2017 2017-01-17 16:23

    图片说明

    评论
    解决 无用
    打赏 举报

相关推荐 更多相似问题