MySQL блокируется в уникальном ключе при использовании инструкции «заменить в» - PullRequest
1 голос
/ 13 апреля 2019

Подведите итог проблемы

Проблема взаимоблокировки возникает, когда оператор «заменить на значения model_test (1, abc, 111)» и оператор как «заменить на значения model_test (2, abcd, 123)»выполнить одновременно в многопоточной среде.

Показать несколько кодов

В производственной среде приведена следующая таблица (упрощение):

id name  value
1  abc   111
2  abcd  123

createоператор таблицы как:

CREATE TABLE `db_research`.`model_test` (
  `id` INT(11) NOT NULL AUTO_INCREMENT,
  `name` VARCHAR(45) NULL,
  `value` INT(11) NULL,
  PRIMARY KEY (`id`),
  UNIQUE INDEX `name_UNIQUE` (`name` ASC));

Когда я выполняю show engine innodb status, мы можем увидеть некоторую информацию о «ПОСЛЕДНЕЙ ОБНАРУЖЕННОЙ ОТКЛЮЧЕНИИ ЗАТЯЖКИ»

Предоставить фон, включая то, что вы уже пытались

версия MySQL: 8.0.11

Я пытался разбить оператор replace into на оператор delete и оператор insert.

транзакция2:

mysql>begin;
mysql>delete from model_test where id = 2;
Query OK,1 row affected(0.02 sec)

транзакция1:

mysql>begin;
mysql>replace into model_test values(1,'abc',111);
(waiting...)

транзакция2:

mysql>insert into model_test values(2,'abcd',123);
Query OK,1 row affected(0.08 sec)

транзакция1:

ERROR 1213 (40001): Deadlock found when trying to get lock; try restarting transaction

show engine innodb status :

*** (1) TRANSACTION:
LOCK WAIT 4 lock struct(s), heap size 1136, 3 row lock(s), undo log entries 2
replace into model_test values(1,'abc','111')
*** (1) WAITING FOR THIS LOCK TO BE GRANTED:
RECORD LOCKS space id 3565 page no 4 n bits 72 index name_UNIQUE of table `db_research`.`model_test` trx id 1238711 lock_mode X waiting

*** (2) TRANSACTION:
5 lock struct(s), heap size 1136, 4 row lock(s), undo log entries 2
insert into model_test values(2,'abcd','123')
*** (2) HOLDS THE LOCK(S):
RECORD LOCKS space id 3565 page no 4 n bits 72 index name_UNIQUE of table `db_research`.`model_test` trx id 1238710 lock_mode X locks rec but not gap

*** (2) WAITING FOR THIS LOCK TO BE GRANTED:
RECORD LOCKS space id 3565 page no 4 n bits 72 index name_UNIQUE of table `db_research`.`model_test` trx id 1238710 lock mode S waiting

*** WE ROLL BACK TRANSACTION (1)

Это из-заБлокировка следующего ключа MySQL для уникального ключа?

...