zoukankan      html  css  js  c++  java
  • 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;  
        }  
  • 相关阅读:
    SQLServer2008 行转列2
    SQLServer2008 行转列
    关于删除数据仓库的数据
    PowerDesign不让name和code联动
    提高SQL查询效率(SQL优化)(转载)
    SQL优化----百万数据查询优化(转载)
    运行程序向一个Java类中动态添加注解。
    开阔自己的视野,勇敢的接触新知识(转)
    [置顶] JAVA识别身份证号码,H5识别身份证号码,tesseract-ocr识别(一)(转)
    一个谷歌程序员的算法学习之路
  • 原文地址:https://www.cnblogs.com/mr-wuxiansheng/p/7044832.html
Copyright © 2011-2022 走看看