happinessaflower 2020-02-15
在plsql中,我们在执行增删改后,并不会马上写到表中,而是要手动点击一下提交按钮提交按钮(f10),如果不想提交刚才执行的代码,则可以点击回滚按钮(shift+f10)。
提交和回滚在plsql中如图:
在后台项目中,如果没有设置自动提交,则默认为自动提交true。这会导致一个问题:数据的不安全。
举个例子,在eclipse中我们写了jdbc连接后却没设置自动提交,代码为从A的账户中向B转1000元,程序在运行中,从A中扣款的代码执行成功了,但向B中添加1000元的代码却抛了异常。
我们查询表发现,A的账户的确少了1000元,但B的账户却没有增加。
第一步:在连接数据库对象创建后使用它调用setAutoCommit(false)方法传入false
第二步:在执行SQL语句的try-catch代码块的try中,SQL语句的代码后添加:conn.commit();//conn为数据库连接对象。在没有SQL语句报异常的情况下正常执行
第三步,在执行SQL语句的try-catch代码块的catch(SQLException e)中,添加:conn.rollback();它表示如果SQL执行语句报异常,则回滚,执行结果不写入表中。
commit()方法就相当于提交按钮,而rollback()方法就相当于回滚按钮。
完整如下例子:
try { //1.加载驱动类 Class.forName(driver); //2.连接指定的数据库对象 conn = DriverManager.getConnection(url,username,password); //3.设置自动提交设置为false conn.setAutoCommit(false); //3.获取sql命令对象 stmt = conn.createStatement(); //4.创建SQL命令 String sql = "insert into dept values(80,‘吃鸡学院‘,‘北京‘)"; String sql2 = "select * from emp"; //5.执行SQL命令 int i = stmt.executeUpdate(sql2);//返回-1表示失败,返回其它数表示成功执行的条数。 System.out.println("执行结果:"+i); conn.commit(); } catch (ClassNotFoundException e) { e.printStackTrace(); }catch(SQLException e){ try { conn.rollback(); } catch (SQLException e1) { e1.printStackTrace(); } e.printStackTrace(); }finally { //6.关闭流 try { if(stmt!=null) { stmt.close(); } } catch (SQLException e) { e.printStackTrace(); } try { if(conn!=null) { conn.close(); } } catch (SQLException e) { e.printStackTrace(); } }