3

1 つのテーブルで保存操作を行うストア プロシージャが 1 つあります。このストア プロシージャでは、テーブルに複数のレコードを挿入しています。

ここに私のテーブル構造があります

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, 'a@a.com,b@b.com,c@c.co.in,g@yahoo.com' );

場合によっては完璧に機能していますが、(私のライブプロジェクトでは) 'ロック待機タイムアウトを超えました' というエラーが発生することがあります。私の「innodb_lock_wait_timeout」は100に設定されています。

これを行うためのより良い方法があれば。または、単一のリクエストに複数のレコードを挿入するにはどうすればよいですか。

私は node.js を使用しており、現在トランザクションを使用しています。

4

0 に答える 0