MySql / Java: превышено ли время ожидания блокировки даже при уровне изоляции? - PullRequest
0 голосов
/ 03 марта 2020

У меня есть хранимая процедура, как показано ниже, которая занимает 2-3 минуты для запуска:

CREATE DEFINER=`root`@`%` PROCEDURE `MyProc`()
BEGIN 
    TRUNCATE mydb.MyTempTable; 
    INSERT INTO mydb.MyTempTable ( SELECT DISTINCT col_1 ... FROM table_1... /*Query that joins a bunch of tables and take a long time*/ )
    COMMIT; 
END

Я обнаружил, что во время работы этого pro c любые INSERT, UPDATE, DELETE выполняются на любом из строк, возвращаемых внутренним запросом, произойдет тайм-аут в ожидании блокировки таблицы (MySQL тайм-аут установлен на 50 секунд). Код Java выдает следующую ошибку:

SQL [ UPDATE table_1... ]; Lock wait timeout exceeded; try restarting transaction; nested exception is com.mysql.cj.jdbc.exceptions.MySQLTransactionRollbackException: Lock wait timeout exceeded; try restarting transaction.

Поэтому я добавил уровень изоляции, как показано ниже, но время от времени я получаю сообщение об ошибке.

CREATE DEFINER=`root`@`%` PROCEDURE `MyProc`()
BEGIN 
    TRUNCATE mydb.MyTempTable; 
    SET TRANSACTION ISOLATION LEVEL READ COMMITTED; 
    INSERT INTO mydb.MyTempTable ( SELECT DISTINCT col_1 ... FROM table_1... /*Query that joins a bunch of tables and take a long time*/ )
    COMMIT; 
END

В чем может быть причина, по которой я получаю эту ошибку?

...