powered by simpleCommunicator - 2.0.60     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Блокировки
5 сообщений из 5, страница 1 из 1
Блокировки
    #39806205
ybuivovk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
привет, форумчане.
Я работаю в компании, по обслуживанию Колл-центов.
У меня есть такая проблема, возможно кто-то поможет с решением(как вариант).
У меня есть БД 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] и тогда не будет дублей по одновременной вставке.


Какие у вас есть варианты? Буду очень благодарен.
...
Рейтинг: 0 / 0
Блокировки
    #39806288
dklim.kzn
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
не гинеколог, но ...

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

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

видел где-то у мс методику подмены вью, но не находится, может и выдумываю
...
Рейтинг: 0 / 0
Блокировки
    #39806323
invm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ybuivovkСоздание уникального индекса RCD и RCKD не вариант, так как есть ситуация, где надо создать еще одну строчку с теми же RCD и RCKD.Фильтрованный уникальный индекс, который будет отсеивать такие ситуации.
...
Рейтинг: 0 / 0
Блокировки
    #39806343
Владислав Колосов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ybuivovk,

конкурирующие процедуры можно разделить при помощи sp_getapplock.
...
Рейтинг: 0 / 0
Блокировки
    #39806373
aleks222
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Владислав Колосовybuivovk,

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

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

ЗЫ. Прикола ради, можно блокировать не процедуру целиком, а значение "RCD и RCKD" ...
...
Рейтинг: 0 / 0
5 сообщений из 5, страница 1 из 1
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Блокировки
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]