ОБНОВЛЕНИЯ SQL / ВСТАВКИ не блокируются во время транзакции - PullRequest
0 голосов
/ 05 мая 2019

У меня есть таблица, в которую постоянно отправляются UPDATES / INSERTS из других процессов, и я пытаюсь выполнить транзакцию в моей таблице SQL, где я вращаю таблицу и перемещаю некоторые из последних значений в новую таблицу, которую ятолько что созданный:

BEGIN TRANSACTION;
CREATE TABLE temp LIKE sales;
RENAME TABLE sales TO sales_05_04_19, temp TO sales
INSERT INTO sales SELECT * FROM sales_05_04_19 WHERE time > 1556953200000;
COMMIT;

Но, похоже, он не блокирует эти ОБНОВЛЕНИЯ / ВСТАВКИ, и некоторые, кажется, фактически пробиваются во вновь созданную таблицу продаж до того, как произойдет ВСТАВКА транзакции.Это приводит к тому, что я получаю сообщение об ошибке при вставке транзакции:

(1062, "Duplicate entry '1' for key 'PRIMARY'")

Я думал, что эта транзакция будет блокировать UPDATES / INSERTS до момента ее фиксации, но здесь это не так.Поэтому я чувствую, что мне нужно было бы приобрести замок.Как бы я поступил так (если это правильный подход к исправлению)?

1 Ответ

2 голосов
/ 05 мая 2019

Если вы хотите запретить обновления таблицы во время выполнения подобных действий, вам нужно будет ЗАБЛОКИРОВАТЬ ТАБЛИЦЫ, а не использовать транзакцию. Я предлагаю создать новую таблицу, заблокировать ее и старую, выполнить переименование switcheroo, выполнить вставку, а затем снять блокировки. Там нет необходимости для сделки. Транзакции позволяют избежать несогласованности, но они не гарантируют порядок, а операторы DDL, такие как создание и переименование таблиц, в любом случае не безопасны для транзакций.

...