MySQL 5.6 тупик в SELECT FOR UPDATE при выборе разных строк по первичному ключу - PullRequest
0 голосов
/ 06 августа 2020

Мне сложно понять, почему возникает этот тупик. Может ли кто-нибудь объяснить мне, как этого избежать и почему?

Из того, что я вижу, у меня выполняется 2 транзакции (id - первичный ключ):

T1: SELECT id FROM table WHERE id IN (1,2) FOR UPDATE
T2: SELECT id FROM table WHERE id IN (3,4) FOR UPDATE

Я использую этот выбор блокировать строки, которые я обновляю позже в транзакции. Как вы можете видеть, они оба выбирают разные строки, но тупиковая блокировка все еще возникает. Это ожидаемое поведение, если да, то почему? Для меня это не имеет смысла. Это даже не говорит о том, что происходит блокировка зазора.

Вот дамп из SHOW ENGINE INNODB STATUS

LATEST DETECTED DEADLOCK
------------------------
2020-08-06 18:33:43 2ae26b344700
*** (1) TRANSACTION:
TRANSACTION 234270104596, ACTIVE 0 sec starting index read
mysql tables in use 1, locked 1
LOCK WAIT 10 lock struct(s), heap size 2936, 29 row lock(s), undo log entries 15
MySQL thread id 942898994, OS thread handle 0x2ae261fc6700, query id 74391216578 192.31.24.111 db Sending data
SELECT id_customer FROM sn_user_quality WHERE id_customer IN (3574634,1892448,4157953,4191571) FOR UPDATE
*** (1) WAITING FOR THIS LOCK TO BE GRANTED:
RECORD LOCKS space id 2045 page no 3 n bits 352 index `PRIMARY` of table `db`.`sn_user_quality` trx id 234270104596 lock_mode X waiting
Record lock, heap no 283 PHYSICAL RECORD: n_fields 9; compact format; info bits 0
 0: len 4; hex 003f7201; asc  ?r ;;
 1: len 2; hex 0000; asc   ;;
 2: len 1; hex 00; asc  ;;
 3: len 6; hex 00368b961c3a; asc  6   :;;
 4: len 7; hex 690001000a257a; asc i    %z;;
 5: len 4; hex 800012c0; asc     ;;
 6: len 4; hex 80001bbc; asc     ;;
 7: len 5; hex 99a70cf26d; asc     m;;
 8: len 5; hex 99a70d486b; asc    Hk;;

*** (2) TRANSACTION:
TRANSACTION 234270104634, ACTIVE 0 sec starting index read
mysql tables in use 1, locked 1
11 lock struct(s), heap size 2936, 22 row lock(s), undo log entries 15
MySQL thread id 942898997, OS thread handle 0x2ae26b344700, query id 74391216598 192.31.24.111 db Sending data
SELECT id_customer FROM sn_user_quality WHERE id_customer IN (3331279,4204817,765650) FOR UPDATE
*** (2) HOLDS THE LOCK(S):
RECORD LOCKS space id 2045 page no 3 n bits 352 index `PRIMARY` of table `db`.`sn_user_quality` trx id 234270104634 lock_mode X
Record lock, heap no 66 PHYSICAL RECORD: n_fields 9; compact format; info bits 0
 0: len 4; hex 000baed2; asc     ;;
 1: len 2; hex 0000; asc   ;;
 2: len 1; hex 00; asc  ;;
 3: len 6; hex 00368b95f3b2; asc  6    ;;
 4: len 7; hex 790001403f26c5; asc y  @?& ;;
 5: len 4; hex 80001518; asc     ;;
 6: len 4; hex 80001b58; asc    X;;
 7: len 5; hex 99a6f16688; asc    f ;;
 8: len 5; hex 99a70d4867; asc    Hg;;

Record lock, heap no 67 PHYSICAL RECORD: n_fields 9; compact format; info bits 0
 0: len 4; hex 000baed2; asc     ;;
 1: len 2; hex 07e4; asc   ;;
 2: len 1; hex 07; asc  ;;
 3: len 6; hex 00362608019e; asc  6&   ;;
 4: len 7; hex 0300000179041c; asc     y  ;;
 5: len 4; hex 80000b54; asc    T;;
 6: len 4; hex 80001ce8; asc     ;;
 7: len 5; hex 99a6f16688; asc    f ;;
 8: len 5; hex 99a6ff7e50; asc    ~P;;

Record lock, heap no 169 PHYSICAL RECORD: n_fields 9; compact format; info bits 0
 0: len 4; hex 000baed2; asc     ;;
 1: len 2; hex 07e4; asc   ;;
 2: len 1; hex 08; asc  ;;
 3: len 6; hex 00368b95f3b2; asc  6    ;;
 4: len 7; hex 790001403f26e6; asc y  @?& ;;
 5: len 4; hex 80001518; asc     ;;
 6: len 4; hex 80001b58; asc    X;;
 7: len 5; hex 99a7020088; asc      ;;
 8: len 5; hex 99a70d4867; asc    Hg;;

Record lock, heap no 271 PHYSICAL RECORD: n_fields 9; compact format; info bits 0
 0: len 4; hex 004021a0; asc  @! ;;
 1: len 2; hex 0000; asc   ;;
 2: len 1; hex 00; asc  ;;
 3: len 6; hex 00368b961c3a; asc  6   :;;
 4: len 7; hex 690001000a252a; asc i    %*;;
 5: len 4; hex 80001324; asc    $;;
 6: len 4; hex 80001b58; asc    X;;
 7: len 5; hex 99a709450e; asc    E ;;
 8: len 5; hex 99a70d486b; asc    Hk;;

Record lock, heap no 272 PHYSICAL RECORD: n_fields 9; compact format; info bits 0
 0: len 4; hex 004021a0; asc  @! ;;
 1: len 2; hex 07e4; asc   ;;
 2: len 1; hex 08; asc  ;;
 3: len 6; hex 00368b961c3a; asc  6   :;;
 4: len 7; hex 690001000a2552; asc i    %R;;
 5: len 4; hex 80001324; asc    $;;
 6: len 4; hex 80001b58; asc    X;;
 7: len 5; hex 99a709450e; asc    E ;;
 8: len 5; hex 99a70d486b; asc    Hk;;

Record lock, heap no 283 PHYSICAL RECORD: n_fields 9; compact format; info bits 0
 0: len 4; hex 003f7201; asc  ?r ;;
 1: len 2; hex 0000; asc   ;;
 2: len 1; hex 00; asc  ;;
 3: len 6; hex 00368b961c3a; asc  6   :;;
 4: len 7; hex 690001000a257a; asc i    %z;;
 5: len 4; hex 800012c0; asc     ;;
 6: len 4; hex 80001bbc; asc     ;;
 7: len 5; hex 99a70cf26d; asc     m;;
 8: len 5; hex 99a70d486b; asc    Hk;;

Record lock, heap no 284 PHYSICAL RECORD: n_fields 9; compact format; info bits 0
 0: len 4; hex 003f7201; asc  ?r ;;
 1: len 2; hex 07e4; asc   ;;
 2: len 1; hex 08; asc  ;;
 3: len 6; hex 00368b961c3a; asc  6   :;;
 4: len 7; hex 690001000a25a1; asc i    % ;;
 5: len 4; hex 800012c0; asc     ;;
 6: len 4; hex 80001bbc; asc     ;;
 7: len 5; hex 99a70cf26d; asc     m;;
 8: len 5; hex 99a70d486b; asc    Hk;;

*** (2) WAITING FOR THIS LOCK TO BE GRANTED:
RECORD LOCKS space id 2045 page no 3 n bits 352 index `PRIMARY` of table `db`.`sn_user_quality` trx id 234270104634 lock_mode X waiting
Record lock, heap no 38 PHYSICAL RECORD: n_fields 9; compact format; info bits 0
 0: len 4; hex 0032d4cf; asc  2  ;;
 1: len 2; hex 0000; asc   ;;
 2: len 1; hex 00; asc  ;;
 3: len 6; hex 00368b961c14; asc  6    ;;
 4: len 7; hex 67000001ad0c2b; asc g     +;;
 5: len 4; hex 8000157c; asc    |;;
 6: len 4; hex 80001a2c; asc    ,;;
 7: len 5; hex 99a6ef6840; asc    h@;;
 8: len 5; hex 99a70d486b; asc    Hk;;

*** WE ROLL BACK TRANSACTION (1)

Таблица

CREATE TABLE `sn_user_quality` (
  `id_customer` int(10) unsigned NOT NULL,
  `year` smallint(5) unsigned NOT NULL,
  `month` tinyint(3) unsigned NOT NULL,
  `tag_quality` decimal(8,4) NOT NULL DEFAULT '0.5000',
  `tag_rating_quality` decimal(8,4) NOT NULL DEFAULT '0.5000',
  `date_add` datetime NOT NULL,
  `date_upd` datetime NOT NULL,
  PRIMARY KEY (`id_customer`,`year`,`month`),
  KEY `year_month` (`year`,`month`),
  CONSTRAINT `sn_user_quality_ibfk_1` FOREIGN KEY (`id_customer`) REFERENCES `sn_profile` (`id_customer`) ON DELETE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...