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

 

posted @ 2017-06-18 17:55  Mr_伍先生  阅读(9338)  评论(0编辑  收藏  举报