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;  
        }  
  • 相关阅读:
    JAVA类型转换
    ASCII码表
    Java运算符的优先级(从高到低)
    Java内各种进制的表示
    java 标识符命名规则
    Java介绍(重要特点)
    多线程
    Mac&iOS之多线程--转自http://geeklu.com/2012/02/thread/
    00002-20180324-数组-列表
    00001-20180324-从列表中获取单个元素
  • 原文地址:https://www.cnblogs.com/mr-wuxiansheng/p/7044832.html
Copyright © 2011-2022 走看看