У меня есть приложение node.js, которое импортирует много данных в базу данных MySQL.Недавно я изменил первичный ключ таблицы на автоматически увеличивающееся целое число.После внесения этого изменения MySQL предоставляет мне большое количество взаимоблокировок и впоследствии не импортирует все данные.
ER_LOCK_DEADLOCK: обнаружена тупиковая ситуация при попытке получить блокировку;попробуйте перезапустить транзакцию
Вот мой вызов node.js к хранимой процедуре MySQL.Это вызывается много раз, одновременно:
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
и таблица:
![enter image description here](https://i.stack.imgur.com/NwZta.png)
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;
Я пытался добавить транзакцию в хранимую процедуру, но это не помогло.Я также попытался обернуть запрос node.js в цикл while, чтобы попытаться повторить операцию, но у меня возникли проблемы с областью видимости, и казалось, что код просто зависает при первом вызове запроса (обратный вызов никогда не срабатывал).
Существует ли стандартный способ устранения взаимоблокировок при такой настройке?Я пытался найти похожие проблемы, но мне не удалось найти что-нибудь подходящее или полезное.