Подведите итог проблемы
Проблема взаимоблокировки возникает, когда оператор «заменить на значения 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 для уникального ключа?