아래 쓴 문제가 계속 생깁니다. > 그누3질답

그누3질답

아래 쓴 문제가 계속 생깁니다. 정보

아래 쓴 문제가 계속 생깁니다.

본문

개발자님이 신경을 좀 써주셨음 하는데.. 소식이 없군요 ㅠㅠ
  • 복사

댓글 전체

그누보드 내부적으로 어떻게 동작하는지는 모르겠지만 제 예상으로는..

그누보드에선 게시물 번호를 실제 wr_id 가 아닌 가상번호를 쓰는데, 이 가상번호는 바로 전 게시물의 가상번호를 DB에서읽어서 그 번호에 +1 을 하여 매기는듯한데, 사용자가 몰릴경우 DB 에서 이전 번호를 읽어오는 속도보다 글이 올라오는 속도가 빠를경우(여럿이 동시에 글을 쓸경우) 이런 문제가 발생하는게 아닌가 싶습니다..
gnuboard.lib.php

--
// 게시판의 다음글 번호를 얻는다.
function get_next_num($table, $notice=0)
{
    // 공지사항일 경우 공지사항에서 가장 작은 번호를 얻고
    if ($notice == -1) {
        $sql1 = " select min(wr_num) from $table where wr_notice = '-1' ";
        $row1 = sql_fetch($sql1);
    }

    // 공지사항이 아닌글에서 가장 작은 번호를 얻어
    $sql2 = " select min(wr_num) from $table where wr_notice = '0' ";
    $row2 = sql_fetch($sql2);

    // 비교하여 작은 수에서 1 뺀 값을 반환
    if ((int)$row1[0] < (int)$row2[0]) {
        return ((int)$row1[0] - 1);
    } else {
        return ((int)$row2[0] - 1);
    }
}
--
위부분에서 다음 글 번호를 받아오더군요..
병목현상이 정확히 어디서 발생하는지 알순 없지만 제 예상이 대충 맞는듯합니다..
버그라기보단 구조적인 문제라고 봐야할까요..? 간단하게 해결하기는 힘들것같군요 ㅜㅜ..
lock 을 거는건 게시판 속도가 느려지는 원인이 될겁니다..
static 변수는 어떻게 쓰신다는건지 ..

어쨌든 현재 상태로는 그누보드로는 유지할수가 없는 상황입니다.. 사람 붐비는 시간대만되면 회원들한테 신나게 혼납니다ㅜㅜ
어쩔 수 없이 다른 보드로의 이전을 생각중입니다..
lib/common.lib.php 의

function get_next_num($table) 를 아래와 같이 수정해 보십시오.


// 게시판의 다음글 번호를 얻는다.
function get_next_num($table)
{
    sql_query(" LOCK TABLE $table READ ");
    // 가장 작은 번호를 얻어
    $sql = " select min(wr_num) as min_wr_num from $table ";
    $row = sql_fetch($sql);
    // 가장 작은 번호에 1을 빼서 넘겨줌
    sql_query(" UNLOCK TABLES ");
    return (int)($row[min_wr_num] - 1);
}


적용해 보신 후 이상이 없는지 알려주시면 감사하겠습니다.
-. 파일경로 및 소스코드 위치 : /lib/gnuboard.lib.php 462라인 근처

-. 원본
// 게시판의 다음글 번호를 얻는다.
function get_next_num($table, $notice=0)
{
    // 공지사항일 경우 공지사항에서 가장 작은 번호를 얻고
    if ($notice == -1) {
        $sql1 = " select min(wr_num) from $table where wr_notice = '-1' ";
        $row1 = sql_fetch($sql1);
    }

    // 공지사항이 아닌글에서 가장 작은 번호를 얻어
    $sql2 = " select min(wr_num) from $table where wr_notice = '0' ";
    $row2 = sql_fetch($sql2);

    // 비교하여 작은 수에서 1 뺀 값을 반환
    if ((int)$row1[0] < (int)$row2[0]) {
        return ((int)$row1[0] - 1);
    } else {
        return ((int)$row2[0] - 1);
    }
}

-. 수정
// 게시판의 다음글 번호를 얻는다.
function get_next_num($table, $notice=0)
{
 sql_query(" LOCK TABLE $table READ ");
    // 공지사항일 경우 공지사항에서 가장 작은 번호를 얻고
    if ($notice == -1) {
        $sql1 = " select min(wr_num) from $table where wr_notice = '-1' ";
        $row1 = sql_fetch($sql1);
    }

    // 공지사항이 아닌글에서 가장 작은 번호를 얻어
    $sql2 = " select min(wr_num) from $table where wr_notice = '0' ";
    $row2 = sql_fetch($sql2);

    // 비교하여 작은 수에서 1 뺀 값을 반환
    if ((int)$row1[0] < (int)$row2[0]) {
        sql_query(" UNLOCK TABLES ");
        return ((int)$row1[0] - 1);
    } else {
        sql_query(" UNLOCK TABLES ");
        return ((int)$row2[0] - 1);
    }
}


~ 라는 의미인것 같습니다.
관리자님께서 잠시 g4와 혼용하신듯 합니다.
-. 관련내용 : http://search.empas.com/search/all.html?a=w&s=&f=&z=A&q=mysql+lock+table

-. 관련내용 : http://k.daum.net/qna/kin/home/qdetail_view.html?boardid=CA&qid=06ZMQ

-. 문제점으로 대두될 수 있는 부분
lock table이 수행되는 과정동안,
대규모 사이트에서 여러 유저의 포스팅이 겹치게 된다면,
'정상적인 등록이 아닌것 같습니다.'라는 경고 메시지를
상당히 자주 볼 수도 있을거라는 우려가 들기는 합니다.
(대규모 사이트를 운영해 본 경험이 없어서 추측만 되는군요.)
lock table 은 함부로 적용하기가 겁나는군요. 나스카님 말씀대로 그럴 수도 있고 속도가 떨어질지도 모르겠기도 해서..
정상등록이 아니라면서 글 등록이 안돼버리면 번호 없이 등록됐을때보다 더 심하게 혼날겁니다  ㅡㅡ;;
일단 실행은 해 보시는 것과
이론상 추측하는 것과는 상당한 차이가 있습니다.

과연 lock table이 얼마만큼 사용자들을 제어하고,
적절하게 게시물 작성 '완료 시점을 제어해 줄 수 있느냐' 겠지요.
Lock table 이란것이 근본적인 문제 해결이 아니라 DB 에 동시 접근할때 가장 먼저 접근한 요청에 대해서만 정상적인 처리를 하고 나머지 요청에 대해선 정상처리가 안될것이기에 적용하기가 꺼려집니다.

제 예상에.. lock 되어 있는 테이블이 접근시, 무시를 할 경우 글이 제대로 작성이 되지 않을것이고, 그렇지 않고 lock 이 풀릴때까지 대기했다가 처리를 한다면 속도가 느려지는 원인이 될것같거든요..
© SIRSOFT
현재 페이지 제일 처음으로