Dbutils 事务处理

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的原理也是清空缓存这样就不会出现上面的问题

郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。