У меня есть одна процедура хранения, которая выполняет операцию сохранения в одной таблице. В этой процедуре хранилища я вставляю несколько записей в таблицу.
вот моя структура таблицы
Table : InviteMst
~~~~~~~~~~~~~~~~~
Name DataType Description
-------- ------------ ----------------------
InviteID Int PrimaryKey (Auto Incr)
Date Date
UserID Int (ForignKey)
EMailID varchar(50)
Guid varchar(36)
store procedure : usp_InviteMst
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
CREATE PROCEDURE `usp_InviteMst`( IN n_UserID INT, IN EmailList MEDIUMTEXT )
BEGIN
DECLARE d_Date DATETIME DEFAULT NOW();
IF LENGTH(EmailList) > 0 THEN
SET @sqlQuery = "";
SET nPos = INSTR(EmailList, ",");
WHILE (nPos <> 0) DO
SET c_EmailID = TRIM(SUBSTRING(EmailList, 1,nPos - 1));
IF c_EmailID <> "" THEN
SET c_Guid = "";
//Here I am checking that If User already exists with same emailid in same date or note.
SELECT Guid INTO c_Guid
FROM InviteMst
WHERE UserID = n_UserID
AND Date = DATE(d_Date)
AND Guid IS NOT NULL
AND EMailID = c_EmailID
ORDER BY Date DESC
LIMIT 0, 1;
SET c_Guid = COALESCEc_Guid ,"");
IF (c_Guid = "") THEN
SET c_Guid = UUID();
//Here I am preparing statement/query for insert
SET @sqlQuery = CONCAT(@sqlQuery, IF(LENGTH(@sqlQuery) > 0,",",""), "(", n_UserID, ", '", d_Date, "','", c_EmailID, "', c_GuID, "') ");
END IF;
END IF;
SET EmailList = SUBSTRING(EmailList, nPos +1, LENGTH(EmailList));
SET nPos = INSTR(EmailList, ",");
END WHILE;
IF (LENGTH(@sqlQuery) > 0) THEN
//Finally here I am inserting in table
SET @sqlQuery = CONCAT("INSERT INTO InviteMst ( UserID, Date, EmailID, Guid ) VALUES ", @sqlQuery);
PREPARE stmt FROM @sqlQuery;
EXECUTE stmt;
SET @sqlQuery = "";
END IF;
END IF;
END
Я вызываю эту процедуру хранения следующим образом:
call usp_InviteMst( 1, '[email protected],[email protected],[email protected],[email protected]' );
Он работает отлично, в случаях, но некоторое время (в моем живом проекте) это ошибка погрешности "Время ожидания ожидания блокировки превышено". мой "innodb_lock_wait_timeout" установлен на 100.
Если есть лучший способ сделать это. или как я могу вставлять многоуровневые записи в один запрос.
Я использую node.js, и сейчас я использую транзакцию.