Java 和 數據庫兩種方式進行加鎖


java方式:

publicstatic synchronized int generate(StringtableName){  
  Stringsql = "select value from t_table_id where table_name=?";  
  Connectionconn = null;  
  PreparedStatementpstmt = null;  
  ResultSetrs = null;  
  intvalue = 0;  
  try{  
    conn= DbUtil.getConnection();  
    pstmt= conn.prepareStatement(sql);  
    pstmt.setString(1,tableName);  
    rs= pstmt.executeQuery();  
    rs.next();  
//                        if(!rs.next()){  
//                                thrownew RuntimeException();  
//                        }  
  value= rs.getInt("value");  
  value++;  
  modifyValueField(conn,tableName,value);  
}catch(Exceptione){  
  e.printStackTrace();  
  thrownew RuntimeException();  
}finally{  
    DbUtil.close(rs);  
    DbUtil.close(pstmt);  
    DbUtil.close(conn);  
}  
  returnvalue;  
}  

 

 

數據庫的方式:

//采用悲觀鎖來實現同步  
//在sql語句后加 for update就加上了鎖,在查詢的時候進行加鎖,在加鎖后不能進行查詢。提交時候后其他人才能查詢。  
public static int generate(String tableName){  
        //使用數據庫的悲觀鎖for update  
        String sql = "select value from t_table_id where table_name=? for update";  
        Connection conn = null;  
        PreparedStatement pstmt = null;  
        ResultSet rs = null;  
        int value = 0;  
        try{  
            conn = DbUtil.getConnection();  
            //設置自動提交為false  
            DbUtil.beginTransaction(conn);  
            pstmt = conn.prepareStatement(sql);  
            pstmt.setString(1, tableName);  
            rs = pstmt.executeQuery();  
            rs.next();  
//          if(!rs.next()){  
//              throw new RuntimeException();  
//          }  
            value = rs.getInt("value");  
            value++;  
            modifyValueField(conn,tableName,value);  
            //提交事務  
            DbUtil.commitTransaction(conn);  
        }catch(Exception e){  
            e.printStackTrace();  
            //回滾事務  
            DbUtil.rollbackTranscation(conn);  
            throw new RuntimeException();  
        }finally{  
            DbUtil.close(rs);  
            DbUtil.close(pstmt);  
            DbUtil.resetConnection(conn);  
            DbUtil.close(conn);  
        }  
        return value;  
    }  

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM