2016-12-27 47 views
0

你好傢伙我試圖驗證otp驗證手動。因爲我已經寫了這個存儲過程。當我開始這段代碼工作正常,但一段時間後,它開始給錯誤。它需要很長的時間來執行約50秒和之後,它給錯誤鎖定等待timeout.o任何人都可以告訴我爲什麼它給這樣的錯誤,以及如何解決它?存儲過程ahowing'鎖超時等待超時嘗試重新啓動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_user需要INDEX(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)。請注意0​​。該表需要INDEX(email_id)

IF(checkmatched=in_otp)THEN沒有意義,因爲checkmatched是無處設置。沒有SELECT沒有設置它。

什麼是ROW_COUNT()?我不認爲它是一個MySQL函數。

+0

我正在使用選擇COUNT來檢查這個MAC ID是否存在,爲此我不需要group by。我們也可以執行SELECT @checkEmailPresent,但是如果您查看其獲取同一表中的多個數據的查詢,並且如果我爲每個數據編寫select查詢,則需要更多時間。 ROW_COUNT IS THERE由於上次查詢,它將返回多少行受到影響。 –

+0

你可以將'INSERT'和'UPDATE'結合成'INSERT ... ON DUPLICATE KEY UPDATE ...',通過簡化一些邏輯。 –

相關問題