什么是事务
在plsql中,我们在执行增删改后,并不会马上写到表中,而是要手动点击一下提交按钮提交按钮(f10),如果不想提交刚才执行的代码,则可以点击回滚按钮(shift+f10)。
提交和回滚在plsql中如图:

jdbc事务的用途
在后台项目中,如果没有设置自动提交,则默认为自动提交true。这会导致一个问题:数据的不安全。
举个例子,在eclipse中我们写了jdbc连接后却没设置自动提交,代码为从A的账户中向B转1000元,程序在运行中,从A中扣款的代码执行成功了,但向B中添加1000元的代码却抛了异常。
我们查询表发现,A的账户的确少了1000元,但B的账户却没有增加。
jdbc设置事务
第一步:在连接数据库对象创建后使用它调用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();
}
}