Сайт Романа ПарпалакаБлог20200830

Одновременная вставка уникальных значений в словарные таблицы — В кресле препода №3

30 августа 2020 года, 23:39

Как правильно добавлять данные в словарную таблицу с уникальными строками одновременно из нескольких потоков? В 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

Поделиться

Кеширование в nginx Ctrl Редактор математических текстов Mathcha

Читайте также

Как разработать систему рекомендаций
Продолжим разговор о системе рекомендаций в S2. Эта система подбирает к каждой заметке набор других заметок, которые посетитель может почитать дальше.
2023
Оптимизация памяти в PHP и функция serialize
Хорошая статья на Хабре про особенности выделения памяти в PHP.
2011
Ember и трудности отладки
Разрабатываю некий сайт, на котором должно быть много яваскрипта и аякса.
2013

Комментарии

#1. 31 августа 2020 года, 07:34. Евгений Степанищев пишет:
Почему не BIGSERIAL?
#2. 31 августа 2020 года, 21:53. пишет:
Это пример для демонстрации, тут можно еще много тонкостей накрутить :) Когда подбирал, даже не задумался о размере поля счетчика.

А при проектировании новых проектов, действительно, есть повод сразу задуматься о том, чтобы инкрементные счетчики были bigint, а не int. Или отказаться от автоинкремента в пользу модных uuid.
#3. 3 сентября 2020 года, 22:54. ud1 пишет:
Ютубером решил стать?

Еще как вариант

insert into WORDS(word)
select 'A' where not exists(select 1 from WORDS where word = 'A')
#4. 4 сентября 2020 года, 00:02. пишет:
Какие люди :)

Экспериментирую с подачей, пробую разные форматы.

С твоим вариантом запроса будут те же самые проблемы, что и с наивным вариантом, возможно, в меньшем масштабе из-за меньшего интервала между чтением и записью. Либо дубли, либо провалившиеся запросы из-за уникального индекса. И одна из одновременных транзакций будет падать.

Оставьте свой комментарий


Формулы на латехе: $$f(x) = x^2-\sqrt{x}$$ превратится в $$f(x) = x^2-\sqrt{x}$$.
Выделение текста: [i]курсивом[/i] или [b]жирным[/b].
Цитату оформляйте так: [q = имя автора]цитата[/q] или [q]еще цитата[/q].
Других команд или HTML-тегов здесь нет.

Записи