동시에 글 올릴 때 순서
본문
출석체크 게시판인데요
0시를 기준으로 1,2,3등 순위을 매겨서 포인트를 차등 지급하고 있습니다.
그런데 경쟁이 생기면서 여러명이 동시에 0시에 출석을 하니까 문제가 있어서 문의드립니다.
1. 디비에 데이터가 생성되는게 순서(? wr_id) 와 맞질 않습니다. 그래서 정말 빠른순으로 등수를 매겼는지 의심이 듭니다.
디비 여분 필드에 기록을 해봤습니다. wr_5가 출석을 클릭하여 $list.skin.php 에 $list[$i]['num'] 값을 넣은겁니다.
2. 구조상 list.skin.php 에서 출석 순위를 매기는게 맞는건지 의구심이 듭니다.
아래는 list.skin.php 에 ' for ($i=0; $i<count($list); $i++) { '코드 안에 삽입한 등수 기록 코드중 일부입니다.
if( $list[$i]['wr_5'] == "" AND substr( $list[$i]['wr_datetime'] , 0, 10 ) == date("Y-m-d") ) {
$p_rank = 0;
$p_day = 0;
$wr_2 = "";
$p_msg_day = "";
$p_msg_rank = "";
$p_msg_event = "";
$wr_5 = $list[$i]['num'];
if( $wr_5 == 1 ) { $p_rank = 300; $p_msg_rank = "1등 +300p " ; sql_query( " UPDATE g5_member SET gold = gold + 1 WHERE DATE(`wr_datetime`) = DATE( NOW() ) AND mb_id = '{$list[$i]['mb_id']}' " ); }
if( $wr_5 == 2 ) { $p_rank = 200; $p_msg_rank = "2등 +200p " ; sql_query( " UPDATE g5_member SET silver = silver + 1 WHERE DATE(`wr_datetime`) = DATE( NOW() ) AND mb_id = '{$list[$i]['mb_id']}' " ); }
if( $wr_5 == 3 ) { $p_rank = 100; $p_msg_rank = "3등 +100p " ; sql_query( " UPDATE g5_member SET bronze = bronze + 1 WHERE DATE(`wr_datetime`) = DATE( NOW() ) AND mb_id = '{$list[$i]['mb_id']}' " ); }
if( $p_msg_rank !="" AND $p_msg_day !="" ) { $p_msg_sp = ' | ' ; }
if( $p_msg_rank =="" AND $p_msg_day =="" ) { $p_msg_sp = ' ' ; } //공백문자
$wr_2 = $p_msg_rank . $p_msg_sp . $p_msg_day . $p_msg_event ;
$sql = "UPDATE {$write_table} SET wr_2 ='$wr_2', wr_5 ='$wr_5' WHERE mb_id = '{$list[$i]['mb_id']}' AND date(wr_datetime)=date(now())";
sql_query($sql);
동시 출석클릭시 일처리? 하는게 맞게 돌아가는건가요? 그렇다면 왜 디비에는 순서대로 기록이 안될까요
답변 4
WHERE DATE(`wr_datetime`) = DATE( NOW()
==
출석 체크면 건수가 아주 많아질 텐데
이런 조건문을 쓰시면 절대? 안 됩니다. index 사용을 포기하는 방식입니다.
WHERE `wr_datetime` between curdate() and curdate() + interval 1 day-interval 1 second
wr_datetime 컬럼은 적절하고 index에 포함되어 있어야 합니다.
초단위까지 출첵이 겹칠수있어서 첫번째 출첵 쿼리시에 테이블에 락을 걸고 출첵 후 락을 풀고하면 겹치지 않게 원하시는 결과가 나올거 같습니다.
common.lib.php 에 function get_uniqid() 한번 보시고 적용해보세요. 적용이 어려우시면 제작의뢰 이용해보세요. 크게 어려운코드가 아니라서 5만원이내로 의뢰가 가능하지 않을까 생각합니다.
php가 실행되고(이 시각을 저장), 이거 저거 하고 DB에 insert합니다.(wr_id 받아옴)
문제는 이 간격이 고르지 못할 수 있다는 거죠.
기준이 DB냐, php냐에 따라 정하시면 됩니다.