用户名: 密码: 忘记密码? 注册

Mysql事务操作失败解决方法

作者:  时间: 2010-11-30
1.现象
     程序中打开了事务进行插入,但是没有commit,表中的数据已经存在,就是回滚也不能删除插入的数据

2.原因
    本表的Storage Engine 为myisam,不是innoDB,不支持事务处理 rollback()

3.解决方法
    使用 alter table xxxx engine = innoDB ; 将表改为 InnoDB 引擎,结果回滚正常。

4.代码

      private void testCrud() {
          Connection conn = null;           //连接对象
          PreparedStatement pstmt = null;   //预编译的SQL语句对象
            try{
                //加载MySQL驱动程序
                Class.forName("com.mysql.jdbc.Driver");
                //连接字符串
                String url = "jdbc:mysql://localhost:3306/test";
                //建立数据库连接
                conn = DriverManager.getConnection(url,"root","");
                //设置事务的隔离级别
               // conn.setTransactionIsolation(Connection. TRANSACTION_REPEATABLE_READ);
                //设置自动提交为false,开始事务
                conn.setAutoCommit(false);
                //带参数的更新语句
                String sql = "INSERT INTO user_info (username ,password ,age )values(?,?,?)";
                //准备语句
                pstmt = conn.prepareStatement(sql);
                //绑定参数,执行更新语句,将张三的账户金额减去1000元
                pstmt.setString(1, "zhangui");
                pstmt.setString(2, "1111");
                pstmt.setInt(3, 300);
                pstmt.execute();
               
                //绑定参数,执行更新语句,将李四的账户金额增加1000元
               // pstmt.setString(1, "zzzzzzzzzzzzzzzzz");  //绑定了非法参数
                //pstmt.setString(2, "1111111111");
                //pstmt.setInt(3, 500);
                //pstmt.execute();  //将抛出SQL异常
                //提交事务
                //conn.commit();
                System.out.println("事务已提交,转账成功!");
                //关闭语句、连接
                pstmt.close(); conn.close();
            }catch(Exception e){
                try{
                    conn.rollback();   //回滚事务
                    System.out.println("事务回滚成功,没有任何记录被更新!");
                }catch(Exception re){
                    System.out.println("回滚事务失败!");
                }
                e.printStackTrace();
            }finally{
                if(pstmt!=null) try{pstmt.close();}catch(Exception ignore){}
                if(conn!=null) try{conn.close();}catch(Exception ignore){}
            }
      
    }