2016-12-27 13 views
0

안녕 얘들 아 내가이 저장 프로 시저를 작성한 수동으로 otp 유효성 검사를하려고합니다.이 코드를 시작했을 때 좋았지 만 시간이 지나면 오류가 발생했습니다. 약 50 초를 실행하는 데 너무 오랜 시간이 걸렸습니다. 그 후 그것은 오류 잠금 대기 timeout.So 줄 사람이 내게 왜 그런 오류를주는 방법과 그것을 해결하기 위해 말할 수 있습니까?저장 프로 시저 '잠금 대기 시간 초과가 초과되었습니다.'mysql 저장 프로 시저에서 트랜잭션을 다시 시작하십시오 '오류가 있습니까?

CREATE DEFINER=`xxxxx`@`xxxx` PROCEDURE `new_mobile_authentication`(
    IN in_macID VARCHAR(500),IN in_otp INT(5),OUT in_msg VARCHAR(100)) 
    BEGIN 
    DECLARE userCount INT(10); 
    DECLARE emailID VARCHAR(100); 
    DECLARE mobileNumber BIGINT(11); 
    DECLARE checkmatched INT(5); 

    DELETE FROM mob_user WHERE NOW()>end_time; 
    SELECT COUNT(*),email,mobile,otp into userCount,emailID,mobileNumber,checkmatched FROM mob_user WHERE mac_id=in_macID ; 
    SET @checkEmailPresent=(SELECT COUNT(*) FROM table A WHERE email_id=emailID); 

    IF(userCount!=0 AND @checkEmailPresent!=0)THEN 
     IF(checkmatched=in_otp)THEN 

     UPDATE table A SET auth='YES',mac_id=in_macID,mobile_num=mobileNumber WHERE email=emailID; 
     SET @affRow=(SELECT ROW_COUNT()); 
     DELETE FROM mob_user WHERE mac_id=in_macID; 
     SELECT @affRow AS affRow,email FROM table A WHERE mac_id=in_macID; 
     ELSE 
     SELECT 'invalid otp' INTO in_msg; 
     END IF; 

    ELSEIF(userCount!=0 AND @checkEmailPresent=0)THEN 
     IF(checkmatched=in_otp)THEN 

     INSERT INTO table A(email,mobile_num,mac_id) VALUE (emailID,mobileNumber,in_macID,); 
     SET @affRow=(SELECT ROW_COUNT()); 
     DELETE FROM mob_user WHERE mac_id=in_macID; 
     SELECT @affRow AS affRow,email FROM table A WHERE mac_id=in_macID; 
     ELSE 
     SELECT 'invalid otp' INTO in_msg; 
     END IF; 
    ELSE 
     SELECT 'session expired' INTO in_msg; 
    END IF; 
    END 
+0

첫 번째 선택 ... 왜? .... 그리고 @affRow 변수는 무엇입니까? – Hackerman

+0

첫 번째 선택은 전자 메일이 존재하는지 여부를 확인하는 유효성 검사를위한 것입니까? 그리고 @affRow는 업데이트 된 행 수를 확인하기위한 것입니다. –

+0

하지만 스토어드 프로 시저 실행 결과는'in_msg' ....에 저장되며 sp의 논리적 단계에'@ affRow'를 사용하지 않습니다! – Hackerman

답변

0

인덱스 추가 및/또는 쿼리 재구성을 통해 제한 시간을 수정했습니다.

mob_userINDEX(end_time)INDEX(mac_id)이 필요합니다.

SELECT COUNT(*), this, that ... 없이는 GROUP BY이 적합하지 않습니다. GROUP BY으로 제대로 작동하지 않습니다. 너는 무엇을 기대 했는가 ??

SET @checkEmailPresent=(SELECT COUNT(*) FROM table A WHERE email_id=emailID)SELECT @checkEmailPresent := COUNT(*) FROM table A WHERE email_id=emailID)으로 다시 쓸 수 있습니다. :=에 유의하십시오. 이 표에는 INDEX(email_id)이 필요합니다.

IF(checkmatched=in_otp)THENcheckmatched이 설정되어 있지 않으므로 의미가 없습니다. 아니요, SELECT이 설정하지 않았습니다.

ROW_COUNT()은 무엇입니까? 나는 그것이 MySQL 함수라고 생각하지 않는다.

+0

이 맥 ID가 존재하는지 여부를 확인하기 위해 선택 COUNT를 사용하고 있으며 그 때문에 그룹화가 필요하지 않습니다. 또한 SELECT @checkEmailPresent를 수행 할 수도 있지만 쿼리를 보면 같은 테이블에서 여러 데이터를 가져 오는 경우 각 데이터에 대해 선택 쿼리를 작성하면 시간이 더 걸립니다. ROW_COUNT IS THERE 마지막 쿼리로 인해 영향을받는 행 수를 반환합니다. –

+0

아마도 'INSERT'와 'UPDATE'를 'INSERT ... ON DUPLICATE KEY UPDATE ...'에 결합 할 수 있습니다. 여기에는 논리의 일부가 단순화되어 있습니다. –