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();
                }
        
    }

 

posted on 2017-01-04 13:18  LuxxXK  阅读(129)  评论(0)    收藏  举报