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

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

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

30 августа 2020 года, 23:39     программирование · видео

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

Поделиться

Комментарии

#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. пишет:
Какие люди :)

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

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

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

Ваше имя:

Комментарий:

Для выделения используйте следующий код: [i]курсив[/i], [b]жирный[/b].
Цитату оформляйте так: [q = имя автора]цитата[/q] или [q]еще цитата[/q].
Ссылку начните с http://. Других команд или HTML-тегов здесь нет.

Сколько будет 36+2?

Записи