Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Блокировки  [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, 13:00    [21871556]     Ответить | Цитировать Сообщить модератору
 Re: Блокировки  [new]
dklim.kzn
Member

Откуда: Казань
Сообщений: 123
не гинеколог, но ...

оставить основную таблицу в покое
сделать две буферные таблицы на каждую нужду отдельно
ночью сводить при необходимости в основную
эти два буфера можно сделать память-оптимизированными для острастки

как более злобный вариант - соорудить из этого всего вью, вставлять в неё
подсунув потребителям вместо основной таблицы под её именем
а основную таблицу переименовать новым красивым именем

видел где-то у мс методику подмены вью, но не находится, может и выдумываю
25 апр 19, 14:38    [21871702]     Ответить | Цитировать Сообщить модератору
 Re: Блокировки  [new]
invm
Member

Откуда: Москва
Сообщений: 9347
ybuivovk
Создание уникального индекса RCD и RCKD не вариант, так как есть ситуация, где надо создать еще одну строчку с теми же RCD и RCKD.
Фильтрованный уникальный индекс, который будет отсеивать такие ситуации.
25 апр 19, 15:14    [21871766]     Ответить | Цитировать Сообщить модератору
 Re: Блокировки  [new]
Владислав Колосов
Member

Откуда:
Сообщений: 7758
ybuivovk,

конкурирующие процедуры можно разделить при помощи sp_getapplock.
25 апр 19, 15:41    [21871791]     Ответить | Цитировать Сообщить модератору
 Re: Блокировки  [new]
aleks222
Member

Откуда:
Сообщений: 956
Владислав Колосов
ybuivovk,

конкурирующие процедуры можно разделить при помощи sp_getapplock.


Одобряю.
Вот тока, нынешние программизды понятия критической секции не проходили.

ЗЫ. Прикола ради, можно блокировать не процедуру целиком, а значение "RCD и RCKD" ...
25 апр 19, 16:11    [21871835]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить