Хранимая процедура ahowing ‘Lock wait timeout exceeded try restarting transaction in mysql stored procedure’ error?Как это сделать?

Здравствуйте, ребята я пытаюсь проверить проверку 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

1 ответ

  1. Исправьте тайм-ауты путем добавления индексов и / или переформулирования запросов.

    mob_user нуждается INDEX(end_time)и INDEX(mac_id).

    SELECT COUNT(*), this, that ... без этого GROUP BYне имеет смысла. И не будет работать правильно с a 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.