MySQL вставляет удерживающие замки на несвязанных столах - PullRequest
1 голос
/ 18 марта 2020

Я получаю этот странный тупик от MySQL:

------------------------
LATEST DETECTED DEADLOCK
------------------------
*** (1) TRANSACTION:
TRANSACTION 2300749061, ACTIVE 1 sec inserting
mysql tables in use 1, locked 1

INSERT INTO `event_entities` ( `entity_id`, `event_id`) VALUES ( '16011341', '8064913' )
*** (1) WAITING FOR THIS LOCK TO BE GRANTED:
RECORD LOCKS space id 38454477 page no 22728 n bits 640 index `event_id` of table `event_entities` trx id 2300749061 lock mode S waiting
*** (2) TRANSACTION:
INSERT INTO `account_entities` ( `entity_id`, `account_id`) VALUES ( '16093815', '4590372' )
*** (2) HOLDS THE LOCK(S):
RECORD LOCKS space id 38454477 page no 22728 n bits 640 index `event_id` of table `event_entities` trx id 2300748502 lock_mode X locks rec but not gap
*** (2) WAITING FOR THIS LOCK TO BE GRANTED:
RECORD LOCKS space id 38454560 page no 21704 n bits 896 index `account_id` of table `account_entities` trx id 2300748502 lock mode S waiting
*** WE ROLL BACK TRANSACTION (1)

Вот как выглядят эти таблицы:

CREATE TABLE `event_entities` (
  `event_id` int(11) NOT NULL,
  `entity_id` int(11) NOT NULL,
  PRIMARY KEY (`event_id`,`entity_id`),
  KEY `entity_id` (`entity_id`),
  CONSTRAINT `event_entities_fk_1` FOREIGN KEY (`event_id`) REFERENCES `events` (`event_id`) ON UPDATE CASCADE,
  CONSTRAINT `event_entities_fk_2` FOREIGN KEY (`entity_id`) REFERENCES `entities` (`entity_id`) ON UPDATE CASCADE
)
CREATE TABLE `account_entities` (
  `account_id` int(11) NOT NULL,
  `entity_id` int(11) NOT NULL,
  PRIMARY KEY (`account_id`,`entity_id`),
  KEY `entity_id` (`entity_id`),
  CONSTRAINT `account_entities_fk_1` FOREIGN KEY (`account_id`) REFERENCES `accounts` (`account_id`) ON UPDATE CASCADE,
  CONSTRAINT `account_entities_fk_2` FOREIGN KEY (`entity_id`) REFERENCES `entities` (`entity_id`) ON UPDATE CASCADE
)

Я не понимаю, почему insert в account_entities удерживает блокировку event_entities, но я уверен, что это как-то связано с обеими таблицами, имеющими FK для сущностей. Кто-нибудь может объяснить, что может происходить?

1 Ответ

0 голосов
/ 08 мая 2020

Скорее всего, это более ранний запрос в транзакции 2, который является блокировкой создания для индекса event_id таблицы event_entities.

. Пожалуйста, включите general_log и опубликуйте все операторы SQL в транзакциях.

...