Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Проектирование БД Новый топик    Ответить
 Дубли строк  [new]
ybuivovk
Member

Откуда:
Сообщений: 23
здравствуйте,
работаю в компании по обслуживанию колл-центров. столкнулся с такой проблемой:
У меня есть БД c:
1. таблицы: [DialerDetail], [Main]
2. процедура InsertScriptCall(вызывается при сохранении результата со скрипта(сайта)) и InsertDialerCall(вызывается при сохранении результатов звонков с дайлера)

Процедура "InsertScriptCall" - сохраняет результат в таблицу [Main]
Процедура "InsertDialerCall" - вытягивает данные с таблицы [DialerDetail], сводит данные и переносит в таблицу [Main].

В этих процедурах идет проверка на уникальность записей в таблице [Main] допустим по ключам RCD и RCKD. Если есть такие ключи, то происходит Update записи, если не находи, то происходит Insert

Сложившееся проблема:
Эти две процедуры могут вызваться одновременно и в итоге могут создаться дублирующие строчки с одинаковым RCD и RCKD.
Я это заметил, когда увидел дубли и у них Дата создания отличается в пару долисекунд.

Создание уникального индекса RCD и RCKD не вариант, так как есть ситуация, где надо создать еще одну строчку с теми же RCD и RCKD.

Какие варианты мы рассматривали:
1. Прописать:
SET TRANSACTION ISOLATION LEVEL SERIALIZABLE
BEGIN TRANSACTION

COMMIT TRANSACTION
SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED

В итоге получили много deadlock

2. пробовали еще вместо Update и Insert написать Merge, но появляется много зависших сессий.
3. думали создать еще одну таблицу для сохранения результатов процедуры "InsertScriptCall", например [ScriptResult]. и потом делать Job, которая по очереди перетягивает данные с таблицы [ScriptResult] и [DialerDetail] все в таблицу [Main] и тогда не будет дублей по одновременной вставке.

Буду рад, если поможете с советом
25 апр 19, 14:30    [21871680]     Ответить | Цитировать Сообщить модератору
 Re: Дубли строк  [new]
Dimitry Sibiryakov
Member

Откуда:
Сообщений: 48131

ybuivovk
есть ситуация, где надо создать еще одну строчку с теми же RCD и RCKD.

Ну и забей. За всё надо платить, в том числе и за денормализацию. Если на твоей СУБД
хранимые агрегаты толком не работают - никак их не заставишь.

Posted via ActualForum NNTP Server 1.5

25 апр 19, 14:35    [21871695]     Ответить | Цитировать Сообщить модератору
 Re: Дубли строк  [new]
Кот Матроскин
Member

Откуда: Москва
Сообщений: 8927
ybuivovk
Какие варианты мы рассматривали:
1. Прописать:
SET TRANSACTION ISOLATION LEVEL SERIALIZABLE
BEGIN TRANSACTION

COMMIT TRANSACTION
SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED

Это слишком мощная штука, т.к. действует на все ресурсы транзакции.
Если Вам нужно выстроить очередь для конкретно вставки звонков - организуйте именно для этого участка подобие семафора (это может быть, например, служебная запись в служебной таблице, обновляемая перед проверкой, или СУБД-специфичные средства).
25 апр 19, 15:20    [21871772]     Ответить | Цитировать Сообщить модератору
 Re: Дубли строк  [new]
s_ustinov
Member

Откуда: Munchen, DE
Сообщений: 2108
ybuivovk,
Я бы думал над SERIALIZABLE.
Возможно, сделал бы дополнительные маленькие и быстрые процедуры для записи без всяких дополнительных действий с высоким уровнем изоляции.
25 апр 19, 19:40    [21872012]     Ответить | Цитировать Сообщить модератору
Все форумы / Проектирование БД Ответить