Node.js MySQL并发死锁
我有一个node.js应用程序,它将大量数据导入MySQL数据库。我最近将表的主键更改为自动递增整数。自从做了这个更改之后,MySQL给了我大量的死锁,并且随后没有导入所有的数据 ER_LOCK_DEADLOCK:尝试获取锁时发现的死锁;尝试重新启动事务 下面是对MySQL存储过程的node.js调用。这被同时称为多次: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
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;