powered by simpleCommunicator - 2.0.53     © 2025 Programmizd 02
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Параллельный доступ к таблице в EXISTS
9 сообщений из 9, страница 1 из 1
Параллельный доступ к таблице в EXISTS
    #39955342
Вопрос к умным людям, то фантазия закончилась к пятнице.

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

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

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

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


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

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

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


Sergey Syrovatchenko,

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

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

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


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

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

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


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