У меня есть хранимая процедура, как показано ниже, которая занимает 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
В чем может быть причина, по которой я получаю эту ошибку?