0

大家好,我正在尝试手动验证 otp 验证。为此,我已经编写了这个存储过程。当我开始这段代码时,它工作正常,但过了一段时间它开始出现错误。执行大约 50 秒和之后花费的时间太长它给出了错误锁定等待超时。那么谁能告诉我为什么它会给出这样的错误以及如何解决它?

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
4

1 回答 1

0

通过添加索引和/或重新编写查询来修复超时。

mob_user需要INDEX(end_time)INDEX(mac_id)

SELECT COUNT(*), this, that ...没有 aGROUP 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)THEN没有意义,因为checkmatched没有设置。不,SELECT没有设置它。

是什么ROW_COUNT()?我不认为这是一个 MySQL 函数。

于 2016-12-28T00:22:55.377 回答