MySQL: Обрезать таблицу внутри транзакции?

У меня есть таблица InnoDB, которую нужно заново заполнять каждые десять минут в пределах от 60 до 200 тысяч записей. До этого момента наш подход был следующим:

  1. Отключить автоматическую фиксацию
  2. Усечь таблицу
  3. Выполнить выборочные запросы и дополнительные вычисления (с использованием PHP)
  4. Вставить новые записи
  5. Зафиксировать

После Однако выполняется операция Truncate, данные немедленно удаляются и больше не доступны из пользовательского интерфейса. Для наших пользователей это довольно сбивает с толку, даже несмотря на то, что примерно через 30 секунд скрипт обнаруживает операцию фиксации, и таблица повторно заполняется.

Я подумал, что, возможно, я смогу обернуть всю операцию, включая ] Усечение в транзакции, и что это может сократить время, в течение которого таблица кажется пользователям пустой. Поэтому я изменил SET AUTOCOMMIT = 0 на START TRANSCATION .

Yikes! Это имело противоположный желаемый эффект! Теперь операция TRUNCATE все еще выполняется в начале сценария, но требуется гораздо больше , чтобы фактически выполнить операции INSERT внутри транзакции, так что когда выполняется операция COMMIT и данные в таблице снова становятся доступными, прошло почти десять минут!

Что могло быть причиной этого? По правде говоря, я вообще не ожидал никаких изменений, потому что у меня создалось впечатление, что инициирование транзакции в любом случае просто отключает Autocommit ??

33
задан AAEM 2 January 2019 в 05:55
поделиться