В SQL Server, как я могу запретить многопоточному приложению читать одну и ту же строку дважды? - PullRequest
1 голос
/ 25 октября 2019

У меня есть набор триггеров, которые создают записи в отдельной таблице событий, когда они обновляются или удаляются. Эта таблица содержит идентификатор, имя таблицы и данные, которые были изменены / удалены.

У меня есть многопоточное приложение .NET core 3.0, которое периодически выбирает запись с самым низким идентификатором, обрабатывает отправляемые данныеобработанные данные передаются в API. После этого он удаляет строку из таблицы.

Проблема состоит в том, что одна и та же строка может быть прочитана дважды отдельными процессами, если SELECT завершается процессом 1, а затем процесс 2 завершает SELECT доУДАЛЕНИЕ было завершено процессом 1.

Поскольку таблица событий не имеет «заблокированного» столбца, я надеялся завершить это с какой-то блокировкой строки и WITH (readpast). Однако, поскольку SELECT и DELETE находятся в отдельных транзакциях, я не уверен, подходит ли это.

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

1 Ответ

0 голосов
/ 26 октября 2019

Альтернативным, и я бы сказал, более безопасным способом предложения Дэвида является сегментирование вашей очереди.

Для системы с двумя процессами вы можете сегментировать свою очередь на нечетные и четные элементы (на основе идентификатора) и иметьодин процесс обрабатывает четные элементы, а другой - нечетные.

Это означает, что между двумя процессами никогда не будет условия тупика / гонки.

Пример:

DECLARE @ProcessID INT = 0 -- 0 for "Process 1" and 1 for "Process 2"
SELECT TOP 1 * FROM [Queue]
WHERE ID % 2 = @ProcessID -- 2 is the number of processes
ORDER BY ID ASC

Из приведенного выше видно, что это можно масштабировать до любого числа процессов.

Преимущества

  • Полностью избегает взаимоблокировок и условий гонки.
  • Нет необходимости в атомарных операциях.

Недостатки

  • Нет гарантии обработки заказа.
  • Если один процесс останавливается,тогда половина предметов не будет обработана.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...