采用java和数据库两种方式进行加锁

来源:互联网 发布:全国人口普查主要数据 编辑:程序博客网 时间:2024/05/21 07:14

采用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 updateString 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();//设置自动提交为falseDbUtil.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;}


原创粉丝点击