Введення
Починаючи з релізів SQL Server 2012, коли екземпляр SQL Server перезапускається, значення стовпця авто-зростання таблиці стрибає, а конкретне значення стрибка визначається типом даних стовпця зростання. Якщо тип даних int, значення стрибка дорівнює 1000, а якщо тип даних bigint, то значення стрибка дорівнює 10000. З нашого проєкту така проблема стрибків є неприйнятною, особливо якщо це показано на боці клієнта. Ця дивна проблема присутня лише в SQL Server 2012 і новіших, і не існує у версіях до SQL Server 2012.
тло
Кілька днів тому колега з нашої команди контролю якості запропонував: Вартість колонки самозростання нашої таблиці незрозуміло підскочила на 10 000. Інакше кажучи, останнє значення стовпця самозбільшення в нашій таблиці було 2200, але тепер, коли ми додали новий запис, значення колонки самозбільшеного стало 12200. У нашій бізнес-логіці такі ситуації не дозволені клієнту, тому нам потрібно вирішити цю проблему.
Використання коду
Спочатку ми всі були дуже дивні, як це сталося? Зазвичай ми не вставляємо жодних значень у самозбільшувані стовпці вручну (ручне вставляння значень у самонадувні стовпці — це нормально), а значення самонадувних стовпців підтримує сама база даних. Один із членів нашої основної команди почав досліджувати це питання і знайшов відповідь. Тепер я хотів би детально пояснити цю проблему та рішення, яке знайшов мій колега.
Як відтворити цю помилку
Вам потрібно встановити SQL Server 2012, а потім створити тестову базу даних. Потім створіть таблицю з самозростаючими стовпцями:
Тепер вставте два дані:
Перегляньте результати:
На цьому етапі результат був таким, як ми й очікували. Тепер перезапустіть свій SQL Server Service. Існує кілька способів перезапустити SQL Service, і тут ми використовуємо SQL Server Manager для його перезапуску:
Після перезапуску ми щойно вставляємо ще 2 частини даних у таблицю:
Перегляньте результати:
Тепер ви бачите результати після перезапуску SQL Server 2012, і його самозростаючі стовпці починаються з 1002. Тобто, підстрибнув на 1000. Як уже згадувалося, якщо доданий тип даних bigint, його значення стрибка буде 10 000.
Чи справді це БАГ?
Microsoft стверджує, що це функція, а не помилка, і корисна в багатьох ситуаціях. Але у нашому випадку така функція не потрібна, бо ці самоінкрементні дані мають бути показані клієнтам, і клієнти почуватимуться дивно, побачивши такі стрибкові дані. А значення стрибка визначається кількістю перезапусків SQL Server. Якщо ці дані не будуть показані клієнтам, вони можуть бути прийнятними. Тому ця функція зазвичай підходить лише для внутрішнього використання.
рішення
Якщо нас не цікавить ця «функція», яку пропонує Microsoft, є два способи її вимкнути.
1. Використання послідовностей
2. Зареєструйте параметр запуску -t272 для SQL Server
Використання послідовностей
По-перше, потрібно прибрати колонки з таблиці з самозбільшенням. Потім створіть послідовність без кешування, з якої вставляються числові значення. Ось приклад коду:
Зареєструйте параметр запуску -t272
Відкритий менеджер конфігурації SQL Server. Виберіть свій екземпляр SQL Server 2012, клацніть правою кнопкою миші та виберіть меню «Властивості». Знайдіть параметри запуску у спливаючому вікні та зареєструйте -t272. Після завершення перезапустіть SQL Server (SQLSERVER2012) на рисунку нижче, а потім виконайте операцію відтворення помилок для перевірки, чи проблема вирішена.
Додаткові примітки:
Якщо у вашій базі даних багато самонадувних таблиць і всі вони мають проблеми з числовим стрибком, краще скористатися другим варіантом. Бо це дуже просто, а обсяг — на рівні сервера. Впровадження другого рішення вплине на всі бази даних у цьому екземплярі сервісу.
|