У меня есть приложение, которое использует номера инцидентов (среди других типов чисел). Эти числа хранятся в таблице с именем «Number_Setup», которая содержит текущее значение счетчика.Обеспечение уникальных номеров из базы данных SQL Server
Когда приложение генерирует новый инцидент, оно содержит таблицу number_setup и получает строку счетчика требуемых номеров (счетчики могут быть сброшены ежедневно, еженедельно и т. Д. И сохраняются как int). Затем он увеличивает счетчик и обновляет строку с новым значением.
Приложение многопользовательское (примерно 100 пользователей в одно и то же время, а также задания sql, которые запускают и захватывают 100 записей инцидентов и запрашивают номера инцидентов для каждого). Таблица инцидентов имеет несколько повторяющихся номеров инцидентов, где они не должны дублироваться.
Сохраненная процедура используется для извлечения следующего счетчика.
SELECT @Counter = counter, @ShareId=share_id, @Id=id FROM Number_Setup WHERE [email protected] AND Counter_Type='I' IF isnull(@ShareId,0) > 0 BEGIN -- use parent counter SELECT @Counter = counter, @ID=id FROM Number_Setup WHERE [email protected] END SELECT @NewCounter = @Counter + 1 UPDATE Number_Setup SET Counter = @NewCounter WHERE [email protected]
я теперь окружен, что блок с транзакцией, но я не совсем уверен, что это будет 100% решить эту проблему, так как я думаю, что есть еще общие замки, так что счетчик может быть прочитан в любом случае.
Возможно, я могу проверить, что счетчик не был обновлен, в заявлении обновления
UPDATE Number_Setup SET Counter = @NewCounter WHERE Counter = @Counter IF @@ERROR = 0 AND @@ROWCOUNT > 0 COMMIT TRANSACTION ELSE ROLLBACK TRANSACTION
я уверен, что это общая проблема с номерами счетов в финансовых приложениях и т.д.
я не могу поставить логика в коде и использовать блокировку на этом уровне. Я также заблокировал HOLDLOCK, но я не уверен, что это приложение. Должно ли оно быть поставлено на два оператора SELECT?
Как я могу обеспечить отсутствие дубликатов?
какая версия сервера Sql? – RBarryYoung
на данный момент, 2000. –