Другими словами, следующий подход "cursoring", который, как гарантируют, будет работать:
LastMax
"SELECT * FROM MyTable WHERE Id > {0}", LastMax
Для этого для работы я должен быть уверен, что каждая строка, я не вошел в шаг 1, имеет идентификатор, больше, чем LastMax
. Это гарантируется, или я могу столкнуться со странными условиями состязания?
Гарантировано, поскольку ни при каких обстоятельствах вы не могли бы получить значение, которое может быть меньше или равно текущему максимальному значению? Нет, такой гарантии нет. Тем не менее, обстоятельства, при которых может произойти этот сценарий, ограничены:
Если ни одно из этих обстоятельств не происходит, вы застрахованы от условий гонки, создающих ситуацию, когда следующее значение ниже, чем существующая стоимость. Тем не менее, нет никакой гарантии, что строки будут зафиксированы в порядке их значений идентичности. Например:
Пока первая транзакция не зафиксирована, 43 существует, а 42 - нет. Столбец идентификаторов просто резервирует значение, а не определяет порядок коммитов.
Единственный раз, когда могут быть вставлены записи, которые вы не получите, это если кто-то включит идентификационную вставку и вставит вручную запись с пропущенным идентификатором (или в некоторых случаях с отрицательным числом). Это довольно редкое явление и обычно выполняется только системным администратором. Это может быть сделано, например, для повторной вставки случайно удаленной записи.
Я думаю, что это может пойти не так, в зависимости от продолжительности транзакций. Рассмотрим следующую последовательность событий:
Строка, вставленная транзакцией A, никогда не будет найдена вашим кодом. На момент выполнения шага 6 это еще не было зафиксировано. И когда будет выполнен следующий запрос, он не будет найден, потому что он имеет более низкое значение в столбце идентификаторов, чем ищет запрос.
Это может сработать, если вы выполните запрос в режиме изоляции чтение без фиксации
Единственное, что гарантирует SQL Server, - это то, что ваш столбец IDENTITY всегда будет увеличиваться.
Однако на что следует обратить внимание:
Что объясняет, почему SQL Server не гарантирует последовательную НЕПРЕРЫВНОСТЬ.
Существует способ сбросить подобный столбец IDENTITY с помощью команды DBCC . Но перед этим учтите следующее:
Столбец IDENTITY - один из самых важных элементов, которые нельзя изменять в DBRM.
Вот ссылка, которая должна вам помочь: Общие сведения о столбцах IDENTITY
EDIT: То, что вы делаете, должно работать, поскольку столбец IDENTITY из LastMax всегда будет увеличиваться для каждой вставленной строки. Итак:
- Выбор строк из таблицы данных;
- Сохранение состояния LastMax;
- Выбор строк, где Id> LastMax.
3) будут выбирать только строки, в которых столбец IDENTITY будет больше, чем LastMax, поэтому вставлен после сохранения LastMax.
Идентификаторы всегда будут следовать инкременту, который определяет идентификатор:
IDENTITY [(seed ,increment)] http://msdn.microsoft.com/en-us/library/aa933196(SQL.80).aspx
который может быть положительным или отрицательным (можно инкрементировать вперед или назад). Если вы установите идентификатор на инкремент вперед, ваши значения идентификатора всегда будут больше предыдущих, но вы можете пропустить некоторые, если откатите INSERT.
Да, если вы установите положительное значение инкремента идентификатора, логика цикла будет работать.