채택완료

get_uniqid 생성시 오류 질문입니다~

2022-05-18 (수) 11:27:47 1,720
Copy
function get_uniqid()
{
    global $g5;

    sql_query(" LOCK TABLE {$g5['uniqid_table']} WRITE ");
    while (1) {
        // 년월일시분초에 100분의 1초 두자리를 추가함 (1/100 초 앞에 자리가 모자르면 0으로 채움)
        $key = date('YmdHis', time()) . str_pad((int)((float)microtime()*100), 2, "0", STR_PAD_LEFT);

        $result = sql_query(" insert into {$g5['uniqid_table']} set uq_id = '$key', uq_ip = '{$_SERVER['REMOTE_ADDR']}' ", false);
        if ($result) break; // 쿼리가 정상이면 빠진다.

        // insert 하지 못했으면 일정시간 쉰다음 다시 유일키를 만든다.
        usleep(10000); // 100분의 1초를 쉰다
    }
    sql_query(" UNLOCK TABLES ");

    return $key;
}

유일키 생성하는 함수를 특정 페이지에 넣고 새로고침을 막하다보면

Cannot execute statement in a READ ONLY transaction.[1792]

이렇게 오류가 뜨는데요 이런건 어떻게 처리를 하는건지 알수있을가요?

서버가 이상한건가 흠

추가내용

Copy
// 특정 페이지 아래처럼 함수 넣고

$orderCode=  get_uniqid();

// 값출력 테스트

echo $orderCode;

위처럼 실행하면 잘되다 10에 1번은 

멈추는 먹통? 현상이 발생해서

함수 부분에

sql_query  부분 오류 디버깅 버분 true 설정 하니 에러출력.

Cannot execute statement in a READ ONLY transaction.[1792]

에러후 새로고침 하면 다시 되길래.. 소스를

Copy
if ($result) break; // 쿼리가 정상이면 빠진다.

이부분을 아래처럼 변경;;

if ($result){

    break; // 쿼리가 정상이면 빠진다.

}else{

    // 오류 나도 함수 다시 실행하게.... 

    get_uniqid()

}

위처럼 수정해서 하긴 했는데 위 처럼 수정해도 문제가 안될가요? 흠 ~

혹 조언좀 해주실분 계신가요~ 

|

답변 1개

채택된 답변
+20 포인트
2022-05-18 (수) 13:13:58
sql_query(" LOCK TABLE {$g5['uniqid_table']} WRITE ");
...
sql_query(" UNLOCK TABLES ");
...

// 이렇게 table lock을 걸면 생기는 현상입니다.

Cannot execute statement in a READ ONLY transaction.[1792]

MySQL의 timeout이 길면 더 자주 발생할 수 있습니다.

https://kimdubi.github.io/mysql/timeout/

답변을 작성하려면 로그인이 필요합니다.