MYSQL: Странный тупик при удалении, почему это происходит? - PullRequest
0 голосов
/ 14 февраля 2019

Я испытываю странную тупиковую ситуацию в MySQL 5.7.

Я использую уровень изоляции «READ COMMITED» (т. Е. Без блокировки пробелов), однако при удалении строк первичным я получаю взаимоблокировку (время от времени).ключ.Странно то, что он сообщает об ожидании блокировки, которой нет даже в запросе.

Таблица определена следующим образом:

CREATE TABLE `table123` (
  `id` bigint(16) NOT NULL AUTO_INCREMENT,
  `col1` int(11) DEFAULT NULL,
  `col2` decimal(13,6) NOT NULL,
  PRIMARY KEY (`id`),
  KEY `col1` (`col1`)
) ENGINE=InnoDB AUTO_INCREMENT=26098012 DEFAULT CHARSET=utf8;

Вот частичный вывод SHOW ENGINE INNODB STATUS:

LATEST DETECTED DEADLOCK
------------------------
2019-02-14 14:22:09 0x7fa4f0077700
*** (1) TRANSACTION:
TRANSACTION 96040670, ACTIVE 0 sec starting index read
mysql tables in use 1, locked 1
LOCK WAIT 12 lock struct(s), heap size 1136, 84 row lock(s), undo log entries 27
MySQL thread id 27032525, OS thread handle 140346247255808, query id 703284759 127.0.0.1 user123 updating
DELETE FROM `table123` WHERE (/*5/280*/ id IN (26053052,26053057,26053062,26053067,26053072,26053077))
*** (1) WAITING FOR THIS LOCK TO BE GRANTED:
RECORD LOCKS space id 1428 page no 3 n bits 176 index PRIMARY of table `schema123`.`table123` trx id 96040670 lock_mode X locks rec but not gap waiting
Record lock, heap no 86 PHYSICAL RECORD: n_fields 5; compact format; info bits 32
 0: len 8; hex 80000000018d8996; asc         ;;
 1: len 6; hex 000005b976dd; asc     v ;;
 2: len 7; hex 42000001402ce3; asc B   @, ;;
 3: len 4; hex 80000166; asc    f;;
 4: len 7; hex 80000000000018; asc        ;;

*** (2) TRANSACTION:
TRANSACTION 96040669, ACTIVE 0 sec fetching rows, thread declared inside InnoDB 4970
mysql tables in use 1, locked 1
13 lock struct(s), heap size 1136, 128 row lock(s), undo log entries 57
MySQL thread id 27032524, OS thread handle 140346378385152, query id 703284777 127.0.0.1 user123 updating
DELETE FROM `table123` WHERE (/*4/343*/ id IN (26053016,26053021,26053026,26053031,26053036,26053041))
*** (2) HOLDS THE LOCK(S):
RECORD LOCKS space id 1428 page no 3 n bits 176 index PRIMARY of table `schema123`.`table123` trx id 96040669 lock_mode X locks rec but not gap
Record lock, heap no 4 PHYSICAL RECORD: n_fields 5; compact format; info bits 32
 0: len 8; hex 80000000018d89a7; asc         ;;
 1: len 6; hex 000005b976dd; asc     v ;;
 2: len 7; hex 42000001403516; asc B   @5 ;;
 3: len 4; hex 80000157; asc    W;;
 4: len 7; hex 800000000000de; asc        ;;

Record lock, heap no 8 PHYSICAL RECORD: n_fields 5; compact format; info bits 32
 0: len 8; hex 80000000018d899b; asc         ;;
 1: len 6; hex 000005b976dd; asc     v ;;
 2: len 7; hex 42000001402d14; asc B   @- ;;
 3: len 4; hex 80000166; asc    f;;
 4: len 7; hex 80000000000035; asc       5;;

Record lock, heap no 13 PHYSICAL RECORD: n_fields 5; compact format; info bits 32
 0: len 8; hex 80000000018d89a2; asc         ;;
 1: len 6; hex 000005b976dd; asc     v ;;
 2: len 7; hex 420000014034e5; asc B   @4 ;;
 3: len 4; hex 80000157; asc    W;;
 4: len 7; hex 80000000000050; asc       P;;

Record lock, heap no 17 PHYSICAL RECORD: n_fields 5; compact format; info bits 32
 0: len 8; hex 80000000018d8997; asc         ;;
 1: len 6; hex 000005b976dd; asc     v ;;
 2: len 7; hex 4200000140316d; asc B   @1m;;
 3: len 4; hex 8000016c; asc    l;;
 4: len 7; hex 80000000000348; asc       H;;

Record lock, heap no 18 PHYSICAL RECORD: n_fields 5; compact format; info bits 32
 0: len 8; hex 80000000018d89a0; asc         ;;
 1: len 6; hex 000005b976dd; asc     v ;;
 2: len 7; hex 42000001402d45; asc B   @-E;;
 3: len 4; hex 80000166; asc    f;;
 4: len 7; hex 80000000000018; asc        ;;

Record lock, heap no 19 PHYSICAL RECORD: n_fields 5; compact format; info bits 32
 0: len 8; hex 80000000018d89a6; asc         ;;
 1: len 6; hex 000005b976dd; asc     v ;;
 2: len 7; hex 42000001403200; asc B   @2 ;;
 3: len 4; hex 8000016c; asc    l;;
 4: len 7; hex 8000000000091d; asc        ;;

Record lock, heap no 21 PHYSICAL RECORD: n_fields 5; compact format; info bits 32
 0: len 8; hex 80000000018d89ab; asc         ;;
 1: len 6; hex 000005b976dd; asc     v ;;
 2: len 7; hex 42000001403231; asc B   @21;;
 3: len 4; hex 8000016c; asc    l;;
 4: len 7; hex 80000000000762; asc       b;;

Record lock, heap no 28 PHYSICAL RECORD: n_fields 5; compact format; info bits 32
 0: len 8; hex 80000000018d89ac; asc         ;;
 1: len 6; hex 000005b976dd; asc     v ;;
 2: len 7; hex 42000001403547; asc B   @5G;;
 3: len 4; hex 80000157; asc    W;;
 4: len 7; hex 800000000000b4; asc        ;;

Record lock, heap no 40 PHYSICAL RECORD: n_fields 5; compact format; info bits 32
 0: len 8; hex 80000000018d89aa; asc         ;;
 1: len 6; hex 000005b976dd; asc     v ;;
 2: len 7; hex 42000001402da7; asc B   @- ;;
 3: len 4; hex 80000166; asc    f;;
 4: len 7; hex 80000000000036; asc       6;;

Record lock, heap no 60 PHYSICAL RECORD: n_fields 5; compact format; info bits 32
 0: len 8; hex 80000000018d899c; asc         ;;
 1: len 6; hex 000005b976dd; asc     v ;;
 2: len 7; hex 4200000140319e; asc B   @1 ;;
 3: len 4; hex 8000016c; asc    l;;
 4: len 7; hex 8000000000074d; asc       M;;

Record lock, heap no 62 PHYSICAL RECORD: n_fields 5; compact format; info bits 32
 0: len 8; hex 80000000018d8998; asc         ;;
 1: len 6; hex 000005b976dd; asc     v ;;
 2: len 7; hex 42000001403483; asc B   @4 ;;
 3: len 4; hex 80000157; asc    W;;
 4: len 7; hex 80000000000050; asc       P;;

Record lock, heap no 70 PHYSICAL RECORD: n_fields 5; compact format; info bits 32
 0: len 8; hex 80000000018d899d; asc         ;;
 1: len 6; hex 000005b976dd; asc     v ;;
 2: len 7; hex 420000014034b4; asc B   @4 ;;
 3: len 4; hex 80000157; asc    W;;
 4: len 7; hex 800000000000b2; asc        ;;

Record lock, heap no 79 PHYSICAL RECORD: n_fields 5; compact format; info bits 32
 0: len 8; hex 80000000018d89a1; asc         ;;
 1: len 6; hex 000005b976dd; asc     v ;;
 2: len 7; hex 420000014031cf; asc B   @1 ;;
 3: len 4; hex 8000016c; asc    l;;
 4: len 7; hex 80000000000348; asc       H;;

Record lock, heap no 86 PHYSICAL RECORD: n_fields 5; compact format; info bits 32
 0: len 8; hex 80000000018d8996; asc         ;;
 1: len 6; hex 000005b976dd; asc     v ;;
 2: len 7; hex 42000001402ce3; asc B   @, ;;
 3: len 4; hex 80000166; asc    f;;
 4: len 7; hex 80000000000018; asc        ;;

Record lock, heap no 87 PHYSICAL RECORD: n_fields 5; compact format; info bits 32
 0: len 8; hex 80000000018d89b1; asc         ;;
 1: len 6; hex 000005b976dd; asc     v ;;
 2: len 7; hex 42000001403578; asc B   @5x;;
 3: len 4; hex 80000157; asc    W;;
 4: len 7; hex 800000000000fa; asc        ;;

Record lock, heap no 88 PHYSICAL RECORD: n_fields 5; compact format; info bits 32
 0: len 8; hex 80000000018d89af; asc         ;;
 1: len 6; hex 000005b976dd; asc     v ;;
 2: len 7; hex 42000001402dd8; asc B   @- ;;
 3: len 4; hex 80000166; asc    f;;
 4: len 7; hex 8000000000004b; asc       K;;

Record lock, heap no 89 PHYSICAL RECORD: n_fields 5; compact format; info bits 32
 0: len 8; hex 80000000018d89b0; asc         ;;
 1: len 6; hex 000005b976dd; asc     v ;;
 2: len 7; hex 42000001403262; asc B   @2b;;
 3: len 4; hex 8000016c; asc    l;;
 4: len 7; hex 80000000000a41; asc       A;;

Record lock, heap no 102 PHYSICAL RECORD: n_fields 5; compact format; info bits 32
 0: len 8; hex 80000000018d89a5; asc         ;;
 1: len 6; hex 000005b976dd; asc     v ;;
 2: len 7; hex 42000001402d76; asc B   @-v;;
 3: len 4; hex 80000166; asc    f;;
 4: len 7; hex 80000000000043; asc       C;;

*** (2) WAITING FOR THIS LOCK TO BE GRANTED:
RECORD LOCKS space id 1428 page no 3 n bits 176 index PRIMARY of table `schema123`.`table123` trx id 96040669 lock_mode X locks rec but not gap waiting
Record lock, heap no 54 PHYSICAL RECORD: n_fields 5; compact format; info bits 32
 0: len 8; hex 80000000018d89ba; asc         ;;
 1: len 6; hex 000005b976de; asc     v ;;
 2: len 7; hex 43000001a213a3; asc C      ;;
 3: len 4; hex 8000010f; asc     ;;
 4: len 7; hex 80000000000028; asc       (;;

*** WE ROLL BACK TRANSACTION (1)

Самая странная часть это:

DELETE FROM `table123` WHERE (/*5/280*/ id IN (26053052,26053057,26053062,26053067,26053072,26053077))
*** (1) WAITING FOR THIS LOCK TO BE GRANTED:
RECORD LOCKS space id 1428 page no 3 n bits 176 index PRIMARY of table `schema123`.`table123` trx id 96040670 lock_mode X locks rec but not gap waiting
Record lock, heap no 86 PHYSICAL RECORD: n_fields 5; compact format; info bits 32
 0: len 8; hex 80000000018d8996; asc         ;;
 1: len 6; hex 000005b976dd; asc     v ;;
 2: len 7; hex 42000001402ce3; asc B   @, ;;
 3: len 4; hex 80000166; asc    f;;
 4: len 7; hex 80000000000018; asc        ;;

Почему он ждет идентификатора заблокированной строки = 26053014 (hex 80000000018d8996), если он даже не участвует в запросе?

1 Ответ

0 голосов
/ 14 февраля 2019

Виновным был тот факт, что mysql иногда решает не использовать индекс.Т.е. этот запрос:

DELETE FROM `table123` WHERE (/*4/343*/ id IN (26053016,26053021,26053026,26053031,26053036,26053041))

иногда не использует индекс, когда это происходит - все строки блокируются.

Это объясняет, почему строка, не задействованная ни в одном из запросов, сообщается как заблокированная.

Сама тупик возникает, потому что я запускаю несколько (не перекрывающихся) DELETE .. IN ()заявления.

...