JDBC(4)_事务处理_1
1.默认情况下,数据库相关的操作的结果是自动提交,即autoCommit=true,
所以,当我们处理一连串数据库操作的时候,首先应该把自动提交给给关闭
即:conn.setAutoCommit(false);
2.在一连串数据库处理操作成功之后,提交事务:conn.commit();
如果失败,则回滚事务:conn.rollback();
具体运用,参照以下例子:
private static void getMoney(Scanner scanner) { /* * 1.获取用户输入的信息 * 2.必要的验证,看看转出账户余额是否足够 * -----事务开始---- * 3.更新转出账户的余额 * 4.更新转入账户的余额 * -----提交事务---- */ System.out.println("现在是转账操作"); System.out.println("请输入您的账号"); String fromUser=scanner.nextLine().trim(); System.out.println("请输入转出接收人账号"); String toUser=scanner.nextLine().trim(); System.out.println("请输入转出金额"); String money=scanner.nextLine().trim(); String countSql="SELECT money FROM USER_A WHERE name='"+fromUser+"'"; try{ Connection conn=DBUtil2.getConnection(); conn.setAutoCommit(false); Statement state=conn.createStatement(); ResultSet rs=state.executeQuery(countSql); //判断是否查询出数据 if(rs.next()){ int count=rs.getInt(1); System.out.println("当前余额:"+count); //判断余额 if(count>=Integer.parseInt(money)){ //执行转账操作 //开始纳入事务操作,因为开始执行DML操作了 String fromSql="UPDATE USER_A SET money=money-"+money+" WHERE name='"+fromUser+"'"; //修改当前用户余额 if(state.executeUpdate(fromSql)>0){ //修改收款人的余额 String toSql="UPDATE USER_A SET money=money+"+money+" WHERE name='"+toUser+"'"; if(state.executeUpdate(toSql)>0){ System.out.print("转账成功"); /* * 两次更新账户操作均成功,才被认为操作完毕。提交事务 */ conn.commit(); } else{ System.out.print("转账失败:没有收款人"+toUser); /* * 若操作失败,则认为整次操作失败。那么进行回滚事务 */ conn.rollback(); } } else{ System.out.println("当前余额修改失败:"); } }else{ System.out.print("余额不足"); } }else{ System.out.print("没有该用户:"+fromUser); } }catch(Exception e){ e.printStackTrace(); }finally{ DBUtil2.closeConnection(); } }
浙公网安备 33010602011771号