DBUtils事务处理

 


@Test
    public void testSaveMoney(){
        Connection conn =null;
        PreparedStatement pstmt = null;
          
        String accountId="123456789";
        double money  =100;
        ResultSet rs = null;
        String sql = "Insert into inaccount (accountid,inbalance) values(?,?)";
        try {
            conn = DBUtil.getCon();
            pstmt = conn.prepareStatement(sql);
            pstmt.setString(1, accountId);
            pstmt.setDouble(2, money);
            pstmt.executeUpdate();
              
            sql = "update account set balance=balance+? where accountid=?";
            pstmt = conn.prepareStatement(sql);
            pstmt.setDouble(1, money);
            pstmt.setString(2, accountId);
            boolean flag = true;
            if(flag){
                throw new SQLException("因网络或不明原因出异常!");
            }
            pstmt.executeUpdate();
              
        } catch (Exception e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }finally{
            DBUtil.close(conn, pstmt, rs);
        }
          
    }

如果不使用事务操作,对于一个银行业务来说是致命的,上面的这个示例,造成的结果就是一个inaccount表中会插入一条数据,而account表中没有任何改变。

事务的类型:

自动提交:执行update马上保存数据

手动提交:执行update不保存数据,先放入缓存,只有执行Commit,才保存

设置事务:


@Test
    public void testSaveMoney(){
        Connection conn =null;
        PreparedStatement pstmt = null;
          
        String accountId="123456789";
        double money  =100;
        ResultSet rs = null;
        String sql = "Insert into inaccount (accountid,inbalance) values(?,?)";
        try {
            conn = DBUtil.getCon();
            conn.setAutoCommit(false);
            pstmt = conn.prepareStatement(sql);
            pstmt.setString(1, accountId);
            pstmt.setDouble(2, money);
            pstmt.executeUpdate();
              
            sql = "update account set balance=balance+? where accountid=?";
            pstmt = conn.prepareStatement(sql);
            pstmt.setDouble(1, money);
            pstmt.setString(2, accountId);
            boolean flag = true;
            if(flag){
                throw new SQLException("因网络或不明原因出异常!");
            }
            pstmt.executeUpdate();
            //提交事务
        } catch (Exception e) {
            // TODO Auto-generated catch block
            //回滚事务,回滚到conn.setAutoCommit(false);
            try {
                conn.rollback();
            } catch (SQLException e1) {
                // TODO Auto-generated catch block
                e1.printStackTrace();
            }
            e.printStackTrace();
        }finally{
            DBUtil.close(conn, pstmt, rs);
        }
          
    }

 

 

在事务没有提交之前,数据时先放到缓存中的,但是事务提交时会将数据保存到表中并清空缓存,rollback的原理也是清空缓存这样就不会出现上面的问题

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值