Я реализую очередь в SQL Server (2008 R2), содержащую задания, которые должны быть выполнены. По завершении задание перемещается в таблицу истории, устанавливая флаг успеха или сбоя. Элементы в таблице очередей имеют столбец идентификации в качестве первичного ключа. Очередь истории имеет комбо этого идентификатора и метку времени в виде PK.
Если задание не выполнено, я бы хотел, чтобы его снова запустили, и, как они думают, это переместить его обратно из таблицы истории и обратно в оперативную очередь. В целях отслеживания я хотел бы, чтобы у повторно вставленной строки был тот же идентификатор, что и у исходной записи, что вызывает проблемы, поскольку это столбец идентификаторов.
Я вижу два возможных решения:
1) Использовать IDENTITY_INSERT:
SET IDENTITY_INSERT TableName ON
-- Move from history to live queue
SET IDENTITY_INSERT TableName OFF
2) Создайте пользовательскую логику для генерации уникальных идентификаторов, например, получите максимальное значение идентификатора как из прямой, так и из очереди истории и добавьте его.
Я не вижу каких-либо реальных проблем с 2, кроме того, что он грязный, возможно, плохой работы и что он заставляет мою невротическую кожу ползать ...
Вариант 1 Мне нравится, но я недостаточно хорошо знаю последствия. Как это будет работать? И я знаю, что одновременное выполнение двух таблиц приведет к краху и сбою. Что произойдет, если два потока сделают это с одной и той же таблицей одновременно?
Является ли это вообще хорошим способом сделать это для обычно используемых хранимых процедур, или этот метод должен просто использоваться для пакетной вставки данных один раз в голубую луну?
Есть мысли о том, какой вариант лучше или есть лучший способ?