Одновременная вставка уникальных значений в словарные таблицы — В кресле препода №3
Как правильно добавлять данные в словарную таблицу с уникальными строками одновременно из нескольких потоков? В PostgreSQL вот так:
CREATE TABLE words (
id SERIAL PRIMARY KEY,
word TEXT NOT NULL UNIQUE
);
BEGIN;
SELECT id FROM words WHERE word = 'a';
INSERT IGNORE INTO words (word) VALUES ('a');
SELECT id FROM words WHERE word = 'a';
COMMIT;
В видео рассказываю, почему именно так, и показываю, как это работает.
00:25 Пример
01:34 Демонстрация наивной реализации вставки в словарные таблицы
02:32 Недостаток: появление дублей
03:45 Демонстрация уникального индекса
04:47 Недостаток одного только уникального индекса
05:55 Нет поддержки целостности ⇒ нужны транзакции
06:37 Демонстрация параллельной вставки в таблицу с уникальным индексом в транзакции
08:59 Вставка с игнорированием
09:17 Демонстрация вставки с игнорированием в транзакции с уровнем READ COMMITTED
12:15 Демонстрация дедлока при вставке с игнорированием в транзакции с уровнем REPEATABLE READ
13:44 Особенности метода в MySQL
Комментарии
А при проектировании новых проектов, действительно, есть повод сразу задуматься о том, чтобы инкрементные счетчики были bigint, а не int. Или отказаться от автоинкремента в пользу модных uuid.
Еще как вариант
insert into WORDS(word)
select 'A' where not exists(select 1 from WORDS where word = 'A')
Экспериментирую с подачей, пробую разные форматы.
С твоим вариантом запроса будут те же самые проблемы, что и с наивным вариантом, возможно, в меньшем масштабе
Оставьте свой комментарий