Якщо ви щойно вбили великий запит, це займе час rollback
. Якщо ви подасте інший запит до того, як вбитий запит буде виконано відкат, ви можете отримати помилку тайм-аута блокування. Ось що зі мною трапилось. Рішення було просто трохи почекати.
Деталі:
Я видав DELETE-запит, щоб видалити близько 900 000 з приблизно 1 мільйона рядків.
Я запустив це помилково (видаляє лише 10% рядків):
DELETE FROM table WHERE MOD(id,10) = 0
Замість цього (видаляє 90% рядків):
DELETE FROM table WHERE MOD(id,10) != 0
Я хотів видалити 90% рядків, а не 10%. Тож я вбив процес у командному рядку MySQL, знаючи, що він відкине всі видалені досі рядки.
Тоді я негайно запустив правильну команду і lock timeout exceeded
незабаром отримав помилку. Я зрозумів, що замок насправді може бути rollback
запитом убитого, який все ще відбувається на задньому плані. Тому я зачекав кілька секунд і повторно провів запит.