Уникальный ключ Mysql вызывает мертвую блокировку

Есть две таблицы stream_lineage_node и stream_lineage_node_relation. Ниже приведены определения таблиц:

CREATE TABLE `stream_lineage_node` (
  `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT COMMENT '主键',
  `node_key` varchar(255) NOT NULL DEFAULT '' COMMENT '血缘节点主键',
  `node_type` varchar(255) NOT NULL DEFAULT '' COMMENT '血缘节点类型',
  `node_desc` varchar(255) NOT NULL DEFAULT '' COMMENT '血缘节点描述',
  `properties` text COMMENT '血缘节点属性',
  `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
  `update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '修改时间',
  PRIMARY KEY (`id`),
  UNIQUE KEY `uniq_node_key` (`node_key`),
  KEY `idx_node_type` (`node_type`)
) ENGINE=InnoDB AUTO_INCREMENT=30705119 DEFAULT CHARSET=utf8mb4 COMMENT='stream血缘节点表'
CREATE TABLE `stream_lineage_node_relation` (
  `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT COMMENT '主键',
  `node_key` varchar(255) NOT NULL DEFAULT '' COMMENT '血缘节点',
  `next_node_key` varchar(255) NOT NULL DEFAULT '' COMMENT '血缘下游节点',
  `relation_type` varchar(255) NOT NULL DEFAULT '' COMMENT '关系类型',
  `properties` text COMMENT '血缘节点属性',
  `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
  `update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '修改时间',
  PRIMARY KEY (`id`),
  UNIQUE KEY `uniq_key_next_key_type` (`node_key`,`next_node_key`,`relation_type`),
  KEY `idx_next_node_key` (`next_node_key`),
  KEY `idx_relation_type` (`relation_type`)
) ENGINE=InnoDB AUTO_INCREMENT=15100909 DEFAULT CHARSET=utf8mb4 COMMENT='stream血缘节点关系表'

Мертвая блокировка mysql возникает, когда код непрерывно вызывает следующие операторы sql в одной транзакции и в параллельной среде.

delete from stream_lineage_node where node_key = ? and node_type = ?
delete from stream_lineage_node_relation where next_node_key= ? and relation_type = ?
insert ignore into stream_lineage_node (node_key, node_type, node_desc, properties) values (?, ?, ?, ?), (?, ?, ?, ?)
insert ignore into stream_lineage_node_relation (node_key, next_node_key, relation_type, properties) values (?, ?, ?, ?)

Ниже приведен журнал мертвых блокировок mysql.

show engine innodb status\G
*************************** 1. row ***************************
  Type: InnoDB
  Name:
Status:
=====================================
2021-03-31 10:54:36 0x7f920577d700 INNODB MONITOR OUTPUT
=====================================
Per second averages calculated from the last 14 seconds
-----------------
BACKGROUND THREAD
-----------------
srv_master_thread loops: 24286472 srv_active, 0 srv_shutdown, 7912821 srv_idle
srv_master_thread log flush and writes: 32199293
----------
SEMAPHORES
----------
OS WAIT ARRAY INFO: reservation count 133475212
OS WAIT ARRAY INFO: signal count 263184954
RW-shared spins 0, rounds 309901947, OS waits 29849278
RW-excl spins 0, rounds 2276291003, OS waits 14249998
RW-sx spins 60882058, rounds 988222500, OS waits 11577714
Spin rounds per wait: 309901947.00 RW-shared, 2276291003.00 RW-excl, 16.23 RW-sx
------------------------
LATEST DETECTED DEADLOCK
------------------------
2021-03-31 10:50:14 0x7f92d6fff700
*** (1) TRANSACTION:
TRANSACTION 10074319369, ACTIVE 0 sec inserting
mysql tables in use 1, locked 1
LOCK WAIT 10 lock struct(s), heap size 1136, 8 row lock(s), undo log entries 3
MySQL thread id 16878758, OS thread handle 140286635210496, query id 14914572875 10.83.189.15 datastudio@dd update
insert ignore into stream_lineage_node (node_key, node_type, node_desc, properties)
        values

        (
            'DRUID_engine_duse_stg_broad_top20',
            'DRUID',
            'engine_duse_stg_broad_top20',
            '{\"datasourceName\":\"engine_duse_stg_broad_top20\",\"woaterDatasourceId\":\"24013\",\"woaterDatasourceIntro\":\"fmt_01\",\"woaterDatasourceTitle\":\"stg数据源\"}'
        )
         ,
        (
            'KAFKA_28_w_duse_stg_top20_broadcast',
            'KAFKA',
            'w_duse_stg_top20_broadcast',
            '{\"brokers\":\"10.8.8.14:30372\",\"clusterId\":\"28\",\"groupId\":\"\",\"topic\":\"w_duse_stg_top20_broadcast\"}'
        )
*** (1) WAITING FOR THIS LOCK TO BE GRANTED:
RECORD LOCKS space id 338 page no 1143 n bits 392 index uniq_node_key of table `datastudio`.`stream_lineage_node` trx id 10074319369 lock mode S waiting
Record lock, heap no 145 PHYSICAL RECORD: n_fields 2; compact format; info bits 32
 0: len 30; hex 44525549445f656e67696e655f647573655f7374675f6d6f6e69746f725f; asc DRUID_engine_duse_stg_monitor_; (total 43 bytes);
 1: len 8; hex 0000000001c96f18; asc       o ;;

*** (2) TRANSACTION:
TRANSACTION 10074319368, ACTIVE 0 sec inserting, thread declared inside InnoDB 5000
mysql tables in use 1, locked 1
15 lock struct(s), heap size 1136, 13 row lock(s), undo log entries 4
MySQL thread id 16879827, OS thread handle 140268649051904, query id 14914572881 10.83.189.15 datastudio@dd update
insert ignore into stream_lineage_node_relation (node_key, next_node_key, relation_type, properties)
        values

            (
            'KAFKA_28_w_duse_stg_order_booking_assign',
            'DRUID_engine_duse_stg_monitor_bookingAssign',
            'STREAM_DRUID',
            '{\"clusterId\":\"28\",\"datasourceName\":\"engine_duse_stg_monitor_bookingAssign\",\"topic\":\"w_duse_stg_order_booking_assign\"}'
            )
*** (2) HOLDS THE LOCK(S):
RECORD LOCKS space id 338 page no 1143 n bits 392 index uniq_node_key of table `datastudio`.`stream_lineage_node` trx id 10074319368 lock_mode X locks rec but not gap
Record lock, heap no 145 PHYSICAL RECORD: n_fields 2; compact format; info bits 32
 0: len 30; hex 44525549445f656e67696e655f647573655f7374675f6d6f6e69746f725f; asc DRUID_engine_duse_stg_monitor_; (total 43 bytes);
 1: len 8; hex 0000000001c96f18; asc       o ;;

*** (2) WAITING FOR THIS LOCK TO BE GRANTED:
RECORD LOCKS space id 339 page no 3029 n bits 248 index uniq_key_next_key_type of table `datastudio`.`stream_lineage_node_relation` trx id 10074319368 lock mode S waiting
Record lock, heap no 165 PHYSICAL RECORD: n_fields 4; compact format; info bits 32
 0: len 30; hex 4b41464b415f32385f775f647573655f7374675f746f7032305f62726f61; asc KAFKA_28_w_duse_stg_top20_broa; (total 35 bytes);
 1: len 30; hex 44525549445f656e67696e655f647573655f7374675f62726f61645f746f; asc DRUID_engine_duse_stg_broad_to; (total 33 bytes);
 2: len 12; hex 53545245414d5f4452554944; asc STREAM_DRUID;;
 3: len 8; hex 0000000000e0cade; asc         ;;

*** WE ROLL BACK TRANSACTION (1)

Может ли кто-нибудь помочь мне объяснить причину мертвой блокировки? А как решить проблему? Благодарю вас !

4 утверждения в одной транзакции?

ysth 01.04.2021 08:26

да, за одну транзакцию

小乙哥 01.04.2021 08:31
Освоение архитектуры микросервисов с Laravel: Лучшие практики, преимущества и советы для
Освоение архитектуры микросервисов с Laravel: Лучшие практики, преимущества и советы для
В последние годы архитектура микросервисов приобрела популярность как способ построения масштабируемых и гибких приложений. Laravel , популярный PHP...
Как построить CRUD-приложение в Laravel
Как построить CRUD-приложение в Laravel
Laravel - это популярный PHP-фреймворк, который позволяет быстро и легко создавать веб-приложения. Одной из наиболее распространенных задач в...
Освоение PHP и управление базами данных: Создание собственной СУБД - часть II
Освоение PHP и управление базами данных: Создание собственной СУБД - часть II
В предыдущем посте мы создали функциональность вставки и чтения для нашей динамической СУБД. В этом посте мы собираемся реализовать функции обновления...
Документирование API с помощью Swagger на Springboot
Документирование API с помощью Swagger на Springboot
В предыдущей статье мы уже узнали, как создать Rest API с помощью Springboot и MySql .
Роли и разрешения пользователей без пакета Laravel 9
Роли и разрешения пользователей без пакета Laravel 9
Этот пост изначально был опубликован на techsolutionstuff.com .
Как установить LAMP Stack - Security 5/5 на виртуальную машину Azure Linux VM
Как установить LAMP Stack - Security 5/5 на виртуальную машину Azure Linux VM
В предыдущей статье мы завершили установку базы данных, для тех, кто не знает.
0
2
58
0

Другие вопросы по теме