Въвеждането
Започвайки с изданията на SQL Server 2012, когато инстанцията на SQL Server се рестартира, стойността на колоната за автоматично растеж на таблицата скача, а конкретната стойност на скока се определя от типа данни на колоната за растеж. Ако типът данни е int, стойността на скока е 1000, а ако типът данни е bigint, стойността на скока е 10000. От нашия проект този вид проблем с прескачане е неприемлив, особено когато се показва от страна на клиента. Този странен проблем присъства само в SQL Server 2012 и по-късни, и не съществува в версии преди SQL Server 2012.
фон
Преди няколко дни колега от нашия QA екип предложи: Стойността на колоната за самоувеличаване на нашата таблица се увеличи с 10 000 необяснимо ниво. С други думи, последната стойност на колоната за самоувеличаване в нашата таблица беше 2200, но сега, когато добавихме нов запис, стойността на самоувеличаващата се колона стана 12200. В нашата бизнес логика такива ситуации не са позволени на клиента, затова трябва да решим този проблем.
Използване на кода
В началото всички бяхме много странни, как се случи това? Обикновено не вмъкваме ръчно никакви стойности в самонадуващи се колони (ръчното вмъкване на стойности в самонадуващи се колони е приемливо), а стойностите на самонадуващите се колони се поддържат от самата база данни. Член на основния ни екип започна да изследва този въпрос и намери отговора. Сега бих искал да обясня този проблем подробно и решението, което колегата ми намери.
Как да възпроизведем този бъг
Ще трябва да инсталираш SQL Server 2012 и след това да създадеш тестова база данни. След това създайте таблица със саморастящи се колони:
Сега вмъкнете две данни:
Прегледайте резултатите:
В този момент резултатът беше същият, както очаквахме. Сега рестартирай услугата на SQL Server. Има няколко начина да рестартирате SQL Service, а тук използваме SQL Server Manager, за да го рестартираме:
След рестарт току-що вмъкваме още 2 парчета данни в таблицата:
Прегледайте резултатите:
Сега виждате резултатите след рестартиране на SQL Server 2012, а самоувеличаващите се стойности на колоните започват от 1002. Тоест, прескочи 1000. Както беше споменато по-рано, ако типът данни, който добавяме, е bigint, неговата скокова стойност ще бъде 10 000.
Наистина ли е БЪГ?
Microsoft заявява, че това е функция, а не бъг, и е полезно в много ситуации. Но в нашия случай не ни е нужна такава функция, защото тези самоинкрементални данни са предназначени да се показват на клиентите и клиентите ще се почувстват странно, ако видят такива скачащи данни. А стойността на скока се определя от броя пъти, в които рестартирате SQL Server. Ако тези данни не бъдат показани на клиентите, може да са приемливи. Затова тази функция обикновено е подходяща само за вътрешна употреба.
решение
Ако не се интересуваме от тази "функция", предлагана от Microsoft, има два начина да я изключим.
1. Използване на последователности
2. Регистрирайте стартовия параметър -t272 за SQL Server
Използване на последователности
Първо, трябва да премахнем самоувеличаващите се колони на таблицата. След това създайте последователност без кеширане, от която се вмъкват числовите стойности. Ето примерния код:
Регистрирайте стартовия параметър -t272
Open SQL Server Configuration Manager. Изберете вашия SQL Server 2012 инстанс, кликнете с десен бутон и изберете менюто Properties. Намерете параметрите за стартиране в изскачащия прозорец и регистрирайте -t272. След завършване рестартирайте SQL Server (SQLSERVER2012) на фигурата по-долу и след това изпълнете операцията за възпроизвеждане на бъгове, за да проверите дали проблемът е решен.
Допълнителни бележки:
Ако имаш много самонадуващи се таблици в базата данни и всички имат проблеми с числовите скокове, по-добре е да използваш втория вариант. Защото е много проста и обхватът е на ниво сървър. Приемането на второто решение ще засегне всички бази данни в тази инстанция на услуга.
|