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