Идентификационные данные SQL (автонумерация) Увеличены Даже с Откатом транзакции

76
задан marc_s 9 December 2017 в 10:42
поделиться

8 ответов

Если Вы думаете об этом, автоинкрементный номер не должен быть транзакционным. Если бы другие транзакции должны были ожидать, чтобы видеть, был ли автоматический номер используемым или "откатываемым", они были бы заблокированы существующей транзакцией с помощью автоматического номера. Например, рассмотрите мой код psuedo ниже с таблицей использование поля автоматического номера для столбца ID:

User 1
------------
begin transaction
insert into A ...
insert into B ...
update C ...
insert into D ...
commit


User 2
-----------
begin transaction
insert into A ...
insert into B ...
commit

, Если пользователь 2 транзакция запускает миллисекунду после пользователя 1, то их вставка в таблицу A должна была бы ожидать пользователя 1 вся транзакция для завершения только, чтобы видеть, вставляет ли автоматический номер сначала в A, использовался.

Это - функция, не ошибка. Я рекомендовал бы использовать другую схему генерировать автоматические номера, если Вам нужны они, чтобы быть плотно последовательными.

101
ответ дан Jason Jackson 24 November 2019 в 11:14
поделиться

Если Вы зависите от своих значений идентификационных данных, являющихся сплошным, то да - Вы делаете его неправильно. Смысл суррогатный ключ к должен иметь никакой бизнес, означающий .

И, нет, нет никакого способа изменить этот behaivor (за исключением прокрутки Вашего собственного автоинкремента и отвечания за последствия производительности блокирования других вставок).

32
ответ дан Mark Brackett 24 November 2019 в 11:14
поделиться

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

6
ответ дан Gavin Miller 24 November 2019 в 11:14
поделиться

Вы получаете разрывы в своей последовательности если Вы DELETE строка также.

Последовательности требуются, чтобы быть уникальными, но они не обязаны быть последовательными. То, что они монотонно увеличиваются, является просто счастливой случайностью реализации.

16
ответ дан Bill Karwin 24 November 2019 в 11:14
поделиться

Все другие плакаты, кто говорит для не волнения об этом, и что Вы должны , получают разрывы, являются правильными. Если существует бизнес-значение к числу, и что значение не танцует джайв с разрывами, то не используйте столбец идентификационных данных.

к вашему сведению, если по любой причине Вы ДЕЙСТВИТЕЛЬНО хотите удалить разрывы, большинство баз данных имеет способ пересеять автоматическую нумерацию к числу по Вашему выбору. Это - боль в заднице, и если Вы должны для делания этого регулярно, Вы определенно не должны использовать автоматический номер / поле идентификационных данных, как отмечено выше. Но вот код, чтобы сделать это в SQL-сервере:

DBCC CHECKIDENT ('продукт', ПЕРЕСЕЙТЕ, 0)

, Который устанавливает таблицу product для отшатываний в 1 (хотя, если у Вас есть записи в таблице, это, очевидно, пропустит Значения идентификаторов, которые уже взяты.) У других поставщиков RDBMS есть свой собственный синтаксис, но эффект является примерно тем же, поэтому ищите, "пересевают идентификационные данные", или "пересевают автоматический номер" в системных справочных файлах или Интернете.

Снова: это для особых случаев, не регулярного использования. Не помещайте его в хранимую процедуру и заставляйте нас всех приехать туда.

6
ответ дан Ian Varley 24 November 2019 в 11:14
поделиться

Я не думаю, что существует любое требование, которое автоматически пронумеровало ключи быть последовательным. На самом деле я не думаю, что они могут быть обязаны быть:

  • транзакция запуски и вставляют
  • , транзакция b запускает и вставляет
  • транзакция аварийные прекращения работы

    , Вы получаете дыру. ничто для делания с этим.

4
ответ дан BCS 24 November 2019 в 11:14
поделиться

Нет. Упорядочьте использование implmentations автономная транзакция. В Oracle автономная транзакция была однажды внутренняя к DBMS, но теперь представлена для Вашего собственного использования (и часто используется неправильно)

PRAGMA AUTONOMOUS_TRANSACTION;' 
1
ответ дан Brian 24 November 2019 в 11:14
поделиться

Muhan пытаются думать о нем в контексте многих одновременных соединений, выполняющих эту транзакцию и не по одному. Некоторые перестанут работать, и некоторые успешно выполнятся. Вы хотите, чтобы SQL Server сконцентрировался на выполнении новых запросов, поскольку они входят а не на поддержании сплошного столбца идентификационных данных. IMO это (разрывы в значениях) является определенно что-то, которое не стоит провести время на.

1
ответ дан Eric Sabine 24 November 2019 в 11:14
поделиться
Другие вопросы по тегам:

Похожие вопросы: