Как избежать блокировки на Вставить в .. Выбрать - PullRequest
0 голосов
/ 20 ноября 2018

Я написал несколько SQL-запросов для обработки ETL, которая интенсивно использует запросы типа INSERT INTO ... SELECT. Я вижу, что репликация Mysql часто останавливается из-за проблемы с блокировкой. Я попытался настроить почти все возможные уровни изоляции транзакций (READ UNCOMMITTED, COMMITTED), но ни один из них не мешает работе. Каковы возможные способы избежать этой проблемы блокировки?

Ответы [ 2 ]

0 голосов
/ 20 ноября 2018

InnoDB:

SET autocommit=0;
LOCK TABLES t1 WRITE, t2 READ;
... do something with tables t1 and t2 here ...
COMMIT;
UNLOCK TABLES;

MyISAM:

LOCK TABLES t1 WRITE, t2 READ;
... do something with tables t1 and t2 here ...
UNLOCK TABLES;
0 голосов
/ 20 ноября 2018

MySQL всегда устанавливает общую блокировку строк, из которых вы читаете, когда вы делаете "гибридные" операторы, которые читают и пишут.

INSERT INTO <table> SELECT ...
CREATE TABLE <table> AS SELECT ...
SET @variable = (SELECT ...)

Единственный обходной путь - выполнить операцию в два этапа:

  1. Извлечение строк в ваше клиентское приложение с помощью оператора SELECT только для чтения
  2. Использовать извлеченные данные в последующем отдельном операторе INSERT

См. Также https://dev.mysql.com/doc/refman/8.0/en/innodb-locks-set.html

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...