Гость
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Параллельный доступ к таблице в EXISTS / 9 сообщений из 9, страница 1 из 1
08.05.2020, 15:10
    #39955342
Параллельный доступ к таблице в EXISTS
Вопрос к умным людям, то фантазия закончилась к пятнице.

Есть таблица в нее делается вставка данных, перед вставкой проверяется существует ли уже такая запись.
Примерная структура:

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
CREATE TABLE dbo.SessionEntiry (
      KeyID INT DEINTITY PRIMARY KEY
    , EntiryID UNIQUEIDENTIFIER NOT NULL
    , ....
)

IF NOT EXISTS(SELECT * FROM dbo.SessionEntiry WHERE EntiryID = @EntiryID)
-- пометить как дубликат в логе
ELSE
-- вставить в итоговую таблицу


Суть в том что у нас в SessionEntiry может быть несколько одинаковых EntiryID
Н-потоков начинают из таблицы выгребать свою порцию KeyID по принципу KeyID % @Divisor = @Modulo
И потом Н-потоков могут одновременно выполнить IF NOT EXISTS в рамках одного @EntiryID и так возникает конфликтная ситуация.

Структура таблицы и логика меняться не будет, поэтому вот думаю как лучше сделать EXISTS.
...
Рейтинг: 0 / 0
08.05.2020, 15:22
    #39955351
aleks222
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Параллельный доступ к таблице в EXISTS
1. Уникальный индекс на EntiryID.
2. Тупо вставлять и обрабатывать ошибку.
...
Рейтинг: 0 / 0
08.05.2020, 15:29
    #39955356
invm
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Параллельный доступ к таблице в EXISTS
Если "в лоб", то
Код: sql
1.
IF NOT EXISTS(SELECT * FROM dbo.SessionEntiry with (updlock, serializable) WHERE EntiryID = @EntiryID)

Соответсвенно, нужен индекс по EntiryID
...
Рейтинг: 0 / 0
08.05.2020, 15:29
    #39955358
Параллельный доступ к таблице в EXISTS
Структуру никто менять не будет. Уникальный индекс тоже нет возможности добавить.
Если еще проще выразиться, то в момент когда одновременно в одном потоке происходит:

Код: sql
1.
INSERT INTO ... (id) VALUES (2)


В другом потоке уже должно корректно понимать что:

Код: sql
1.
IF EXISTS(SELECT * FROM .... WHERE id = 2)
...
Рейтинг: 0 / 0
08.05.2020, 15:32
    #39955360
msLex
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Параллельный доступ к таблице в EXISTS
aleks222
1. Уникальный индекс на EntiryID.

Sergey Syrovatchenko
в SessionEntiry может быть несколько одинаковых EntiryID


Sergey Syrovatchenko,

Правильно ли я понимаю, что вам нужно позволять вставлять данные в dbo.SessionEntiry только если будущий KeyID % @Divisor для EntiryID еще не существует в таблице?

Т.к. определить значение identity до вставки нельзя, проверяйте после и удаляйте ненужные записи. Это если совсем ничего в структуре данных менять нельзя.
...
Рейтинг: 0 / 0
08.05.2020, 15:33
    #39955361
Параллельный доступ к таблице в EXISTS
Либо другой вариант, когда Н-потоков одновременно делают проверку на

Код: sql
1.
IF EXISTS(SELECT * FROM .... WHERE id = 2)


Первый кто успел вставил, а уже другие фактически будут вставлять дубликаты.
...
Рейтинг: 0 / 0
08.05.2020, 15:41
    #39955368
invm
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Параллельный доступ к таблице в EXISTS
Sergey Syrovatchenko,

Чтобы исключить вставку дубликатов ваши exists нужно выстраивать в очередь.
Один из способов я уже показал.
Более щадящий - эксклюзивный applock уровня транзакции на основе значения @EntiryID

А вообще подобное делается через merge. Но все равно для гарантии исключения возникновения дубликатов придется включать serializable для целевой таблицы.
...
Рейтинг: 0 / 0
08.05.2020, 16:32
    #39955385
invm
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Параллельный доступ к таблице в EXISTS
Ну и еще вариант - уникальный индекс по EntiryID с IGNORE_DUP_KEY
Данные вставлять, если @@rowcount = 0, то апдейтить.
...
Рейтинг: 0 / 0
08.05.2020, 16:50
    #39955396
Владислав Колосов
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Параллельный доступ к таблице в EXISTS
Да, без очереди никак. Но будет узкое горло. Лучшее решение - уникальный индекс с игнором дубликатов ключей. Если N потоков не захотят ждать, то организуйте очередь ServiceBroker с последовательной обработкой одного запроса за одним.
...
Рейтинг: 0 / 0
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Параллельный доступ к таблице в EXISTS / 9 сообщений из 9, страница 1 из 1
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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