一、事务概述
1.什么是事务
一件事情有n个组成单元,要不这n个组成单元同时成功,要不n个单元就同时失败,就是将n个组成单元放到一个事务中。
2.mysql的事务
默认的事务:一条sql语句就是一个事务 默认就开启事务并提交事务
手动事务:
1)显示的开启一个事务:start transaction
2)事务提交:commit代表从开启事务到事务提交 中间的所有的sql都认为有效 真正的更新数据库
3)事务的回滚:rollback 代表事务的回滚 从开启事务到事务回滚 中间的所有的sql操作都认为无效 数据库没有被更新
二、JDBC的事务
默认是自动事务:
执行sql语句:executeUpdate() ---- 每执行一次executeUpdate方法 代表事务自动提交
通过jdbc的API手动事务:
开启事务:conn.setAutoComnmit(false);
提交事务:conn.commit();
回滚事务:conn.rollback();
注意:控制事务的connnection必须是同一个
执行sql的connection与开启事务的connnection必须是同一个才能对事务进行控制
三、DBUtils事务操作
1.QueryRunner
有参构造:QueryRunner runner = new QueryRunner(DataSource dataSource);
有参构造将数据源(连接池)作为参数传入QueryRunner,QueryRunner会从连接池中获得一个数据库连接资源操作数据库,所以直接使用无Connection参数的update方法即可操作数据库
无参构造:QueryRunner runner = new QueryRunner();
无参的构造没有将数据源(连接池)作为参数传入QueryRunner,那么我们在使用QueryRunner对象操作数据库时要使用有Connection参数的方法
四、案例-转账操作(若不用事务会造成明明显示转账失败,数据库却操作了数据)
事务在业务层执行
1 public class TransferService { 2 3 public boolean transfer(String out, String in, double money) { 4 //创建dao对象 5 TransferDao dao=new TransferDao(); 6 7 boolean isTransferSuccess=true; 8 Connection conn=null; 9 try { 10 //开启事务 11 conn=DataSourceUtils.getConnection(); 12 conn.setAutoCommit(false); 13 //转出钱的方法 14 dao.out(conn,out,money); 15 16 //故意制造异常 17 int i=1/0; 18 19 //转入钱的方法 20 dao.in(conn,in,money); 21 22 } catch (Exception e) { 23 isTransferSuccess=false; 24 //回滚事务 25 try { 26 conn.rollback(); 27 } catch (SQLException e1) { 28 e1.printStackTrace(); 29 } 30 e.printStackTrace(); 31 }finally{ 32 try { 33 //提交事务(回滚之后回到开启事务的地方,最后finally依然没执行) 34 conn.commit(); 35 } catch (SQLException e) { 36 e.printStackTrace(); 37 } 38 } 39 return isTransferSuccess; 40 } 41 }