Node.js MySQL并发死锁

Node.js MySQL并发死锁,mysql,node.js,stored-procedures,concurrency,deadlock,Mysql,Node.js,Stored Procedures,Concurrency,Deadlock,我有一个node.js应用程序,它将大量数据导入MySQL数据库。我最近将表的主键更改为自动递增整数。自从做了这个更改之后,MySQL给了我大量的死锁,并且随后没有导入所有的数据 ER_LOCK_DEADLOCK:尝试获取锁时发现的死锁;尝试重新启动事务 下面是对MySQL存储过程的node.js调用。这被同时称为多次: pool.query( "CALL AddItineraryDayLocation(?,?,?,?)", [itineraryId, location.name

我有一个node.js应用程序,它将大量数据导入MySQL数据库。我最近将表的主键更改为自动递增整数。自从做了这个更改之后,MySQL给了我大量的死锁,并且随后没有导入所有的数据

ER_LOCK_DEADLOCK:尝试获取锁时发现的死锁;尝试重新启动事务

下面是对MySQL存储过程的node.js调用。这被同时称为多次:

pool.query(
    "CALL AddItineraryDayLocation(?,?,?,?)",
    [itineraryId, location.name, location.longitude, location.latitude],
    function(error, results, fields) {
        if (error) 
            console.log(error);    
    }
);
以下是存储过程:

CREATE PROCEDURE `AddItineraryDayLocation`(
    IN tourItineraryId int,
    IN name VARCHAR(50),
    IN longitude decimal(12,8),
    IN latitude decimal(12,8)
)
BEGIN

    INSERT INTO
        touritinerarylocation (`tourItineraryId`, `name`, `longitude`, `latitude`)
    VALUES
        (tourItineraryId, name, longitude, latitude)
    ON DUPLICATE KEY UPDATE
        `tourItineraryId` = tourItineraryId,
        `name` = name,
        `longitude` = longitude,
        `latitude` = latitude;

END
下表:

我尝试向存储过程添加事务,但没有帮助。我还尝试将node.js查询包装在while循环中以尝试重试该操作,但我在范围界定方面遇到了问题,代码似乎在第一次调用查询时就停止了(回调从未命中)


有没有一种处理这种设置死锁的标准方法?我尝试搜索类似的问题,但找不到任何相关或有用的内容。

您的表有哪些索引?主键是
tourItineraryLocationId
。在
tourItineraryId
经度
纬度
上有一个唯一的索引。“tourItineraryId”上还有一个外键。为了进一步澄清问题,在问题中添加了create语句。我建议您不要在重复键更新中使用
,而应该使用普通
选择
插入
更新
,并记住将它们全部包装在事务中
CREATE TABLE `touritinerarylocation` (
  `tourItineraryLocationId` int(11) NOT NULL AUTO_INCREMENT,
  `tourItineraryId` int(11) NOT NULL,
  `name` varchar(50) DEFAULT NULL,
  `longitude` decimal(12,8) NOT NULL,
  `latitude` decimal(12,8) NOT NULL,
  PRIMARY KEY (`tourItineraryLocationId`),
  UNIQUE KEY `tourItineraryId_longitude_latitude_UNIQUE` (`tourItineraryId`,`longitude`,`latitude`),
  KEY `fk_tourItineraryLocation_tourItinerary_idx` (`tourItineraryId`),
  CONSTRAINT `fk_tourItineraryLocation_tourItinerary` FOREIGN KEY (`tourItineraryId`) REFERENCES `touritinerary` (`tourItineraryId`) ON DELETE NO ACTION ON UPDATE NO ACTION
) ENGINE=InnoDB AUTO_INCREMENT=11674 DEFAULT CHARSET=utf8;