Perkenalan
Dimulai dengan rilis SQL Server 2012, saat instans SQL Server dimulai ulang, nilai kolom pertumbuhan otomatis tabel melompat dan nilai lompatan tertentu ditentukan oleh jenis data kolom pertumbuhan. Jika tipe datanya adalah int, nilai lompatannya adalah 1000, dan jika tipe datanya adalah bigint, nilai lompatannya adalah 10000. Dari proyek kami, masalah lompatan semacam ini tidak dapat diterima, terutama jika ditampilkan di sisi klien. Masalah aneh ini hanya ada di SQL Server 2012 dan yang lebih baru, dan tidak ada di versi sebelum SQL Server 2012.
latar
Beberapa hari yang lalu, seorang kolega dari tim QA kami menyarankan: Nilai kolom self-incrementing tabel kami melonjak 10.000 secara misterius. Dengan kata lain, nilai terakhir dari kolom self-incrementing dalam tabel kita adalah 2200, tetapi sekarang kita telah menambahkan catatan baru, nilai kolom self-incremented telah menjadi 12200. Dalam logika bisnis kami, situasi seperti ini tidak diperbolehkan pada klien, jadi kami perlu menyelesaikan masalah ini.
Penggunaan kode
Awalnya kami semua sangat aneh, bagaimana ini bisa terjadi? Kami biasanya tidak menyisipkan nilai apa pun secara manual ke dalam kolom yang bertambah sendiri (menyisipkan nilai secara manual ke dalam kolom yang mengembang sendiri tidak apa-apa), dan nilai kolom yang mengembang sendiri dikelola oleh database itu sendiri. Seorang anggota tim inti kami mulai meneliti pertanyaan ini dan menemukan jawabannya. Sekarang, saya ingin menjelaskan masalah ini secara rinci dan solusi yang ditemukan rekan kerja saya.
Cara mereproduksi bug ini
Anda perlu menginstal SQL Server 2012 dan kemudian membuat database pengujian. Kemudian buat tabel dengan kolom yang tumbuh sendiri:
Sekarang masukkan dua bagian data:
Tinjau hasilnya:
Pada titik ini, hasilnya sama seperti yang kami harapkan. Sekarang mulai ulang Layanan SQL Server Anda. Ada beberapa cara untuk memulai ulang SQL Service, dan di sini kita menggunakan SQL Server Manager untuk memulai ulang:
Setelah memulai ulang, kami memasukkan 2 potongan data lagi ke dalam tabel barusan:
Tinjau hasilnya:
Sekarang Anda melihat hasil setelah memulai ulang SQL Server 2012, dan nilai kolom yang bertambah sendiri dimulai pada 1002. Artinya, melompat 1000. Seperti disebutkan sebelumnya, jika tipe data yang kita tambahkan adalah bigint, nilai lompatannya akan menjadi 10.000.
Apakah itu benar-benar BUG?
Microsoft menyatakan bahwa ini adalah fitur, bukan bug, dan berguna dalam banyak skenario. Tetapi dalam kasus kami, kami tidak memerlukan fungsi seperti itu, karena data inkremental sendiri ini dimaksudkan untuk ditampilkan kepada pelanggan, dan pelanggan akan merasa aneh jika mereka melihat data yang melompat seperti itu. Dan nilai lompatan ditentukan oleh berapa kali Anda memulai ulang SQL Server. Jika data ini tidak ditampilkan kepada pelanggan, data ini mungkin dapat diterima. Oleh karena itu, fitur ini biasanya hanya cocok untuk penggunaan internal.
larutan
Jika kita tidak tertarik dengan "fitur" yang ditawarkan oleh Microsoft ini, ada dua cara untuk mematikannya.
1. Menggunakan Urutan
2. Daftarkan parameter startup -t272 untuk SQL Server
Gunakan urutan
Pertama, kita perlu menghapus kolom tabel yang bertambah sendiri. Kemudian buat urutan tanpa caching, dari mana nilai numerik dimasukkan. Berikut adalah kode sampelnya:
Daftarkan parameter startup -t272
Buka SQL Server Configuration Manager. Pilih instans SQL Server 2012 Anda, klik kanan, dan pilih menu Properti. Temukan parameter peluncuran di jendela pop-up dan daftarkan -t272. Setelah selesai, mulai ulang SQL Server (SQLSERVER2012) pada gambar di bawah ini, lalu lakukan operasi reproduksi bug untuk memverifikasi apakah masalah telah teratasi.
Catatan Tambahan:
Jika Anda memiliki banyak tabel yang mengembang sendiri di database Anda dan semuanya memiliki masalah lompatan numerik, maka lebih baik menggunakan opsi kedua. Karena sangat sederhana dan ruang lingkupnya tingkat server. Mengadopsi solusi kedua akan memengaruhi semua database pada instans layanan ini.
|