У меня есть кластер из 3 серверов percona db, и эта таблица:
CREATE TABLE `metric` (
`metricid` bigint(20) unsigned NOT NULL AUTO_INCREMENT,
`host` varchar(50) NOT NULL,
`userid` int(10) unsigned DEFAULT NULL,
`name` varchar(255) NOT NULL,
`sampleid` tinyint(3) unsigned NOT NULL,
PRIMARY KEY (`metricid`),
UNIQUE KEY `unique-metric` (`userid`,`host`,`name`,`sampleid`)
) ENGINE=InnoDB AUTO_INCREMENT=1000000000000 DEFAULT CHARSET=utf8
Каждый сервер (идентификаторы 1,2,3) выполняет этот запрос каждую секунду:
insert into metric set metricid = $serverId$now, host = $now, name = $serverId
(e.g. insert into metric set metricid = 31396887217, host = 1396887217, name = 3
)
И довольно быстро я сталкиваюсь с «ОШИБКОЙ 1213 (40001) в строке 1: обнаружена взаимоблокировка при попытке получить блокировку; попробуйте перезапустить транзакцию» - учитывая, что я предоставляю идентификаторы, которые не перекрываются, поскольку каждый сервер создает идентификатор с другим префиксом , почему взаимоблокировки вообще случаются?