2013-04-26 6 views
0

Я вызываю хранимую процедуру с PHP-страницы. Он нормально работает нормально. Но я использовал инструмент тестирования и пытался эмулировать несколько запросов. Но иногда я получаю ответ, как это:Ошибка блокировки с хранимой процедурой

«тупиков нашли при попытке получить блокировку, попробуйте перезапустить транзакцию»

Вот хранимая процедура:

DELIMITER $$ 

USE `mydb`$$ 

DROP PROCEDURE IF EXISTS `UserRegistration`$$ 

CREATE DEFINER=`root`@`localhost` PROCEDURE `UserRegistration`(IN `sfname` VARCHAR(200), IN `slname` VARCHAR(200), IN `semail` VARCHAR(200), IN `saddress` TEXT, IN `scity` VARCHAR(200), IN `sstate` VARCHAR(200), IN `szipcode` VARCHAR(20), IN `scountry` VARCHAR(200), IN `spin` VARCHAR(255), IN `sactivation_code` TEXT, IN `slcard_no` VARCHAR(20), IN `sgcm_regid` TEXT, OUT `rflag` INT) 
BEGIN 
    DECLARE user_id INT DEFAULT 0; 
    SET rflag=0; 

    DELETE FROM user_device_details WHERE udd_user_id_fk IN (SELECT upd_user_id_pk FROM user_personal_details WHERE upd_email_id=semail); 
    DELETE FROM user_credit_card_details WHERE uccd_user_id_fk IN (SELECT upd_user_id_pk FROM user_personal_details WHERE upd_email_id=semail); 
    DELETE FROM user_photo_details WHERE upd_user_id_fk IN (SELECT upd_user_id_pk FROM user_personal_details WHERE upd_email_id=semail); 

    DELETE FROM transaction_history_details WHERE thd_user_id_fk IN (SELECT upd_user_id_pk FROM user_personal_details WHERE upd_email_id=semail); 
    DELETE FROM user_loyalty_card_details WHERE ulcd_user_id_fk IN (SELECT upd_user_id_pk FROM user_personal_details WHERE upd_email_id=semail); 


    DELETE FROM user_device_gcm_details WHERE udgd_user_id_fk IN (SELECT upd_user_id_pk FROM user_personal_details WHERE upd_email_id=semail); 
    DELETE FROM user_secure_details WHERE usd_user_id_fk IN (SELECT upd_user_id_pk FROM user_personal_details WHERE upd_email_id=semail); 
    DELETE FROM user_personal_details WHERE upd_email_id=semail; 

    SELECT upd_user_id_pk INTO user_id FROM user_personal_details WHERE upd_email_id=semail; 
    INSERT INTO user_personal_details(upd_first_name,upd_last_name,upd_email_id,upd_address,upd_city,upd_state,upd_zipcode,upd_country)VALUES(sfname,slname,semail,saddress,scity,sstate,szipcode,scountry); 
    SELECT LAST_INSERT_ID() INTO user_id; 
    INSERT INTO user_secure_details(usd_user_id_fk,usd_activation_code,usd_pin)VALUES(user_id,sactivation_code,spin); 
    INSERT INTO user_device_gcm_details(udgd_user_id_fk, udgd_gcm_regid)VALUES(user_id,sgcm_regid); 
    INSERT INTO user_loyalty_card_details(ulcd_card_no, ulcd_user_id_fk,ulcd_points)VALUES(slcard_no,user_id,'0.00'); 
    SET rflag=user_id; 
END$$ 

DELIMITER ; 

Предложите мне решение для решения этой проблемы.

+1

Не уверен, но может случиться так, что база данных пытается удалить записи из базы данных, и в то же время выполняется другой оператор вставки, который ожидает, что база данных выведет блокировку в таблице. – ankurtr

+0

@ ankur.trapasiya: Есть ли решение для этой проблемы? –

+1

http://stackoverflow.com/questions/2332768/how-to-avoid-mysql-deadlock-found-when-trying-to-get-lock-try-restarting-trans представляется полезным. – ankurtr

ответ

0

Вы должны использовать WITH(NOLOCK) в операторах SELECT.

Смежные вопросы