Saya memiliki urutan yang menghasilkan nomor pelacakan untuk objek di sistem saya. Sudah cukup lama bekerja dengan baik.
Minggu lalu kami perhatikan bahwa itu mulai menggunakan kembali nilai.
Apa yang tampaknya terjadi adalah bahwa pada titik yang berbeda di malam hari, itu akan mundur ke nilai seperti hari sebelumnya. Kemudian akan terus menghasilkan nilai dari titik itu.
Jadi misalnya saya bisa mendapatkan sesuatu seperti ini:
10112
10113
10114
10115
10116
10117
10118
10113
10114
10115
10116
...
Tampaknya tidak ada pola apa pun ketika itu terjadi, durasi antara penggunaan pertama dan penggunaan kedua (sesedikit 10 menit atau beberapa jam) atau berapa banyak yang digulung kembali (sesedikit 1 dan beberapa ratus).
Saya berpikir tentang menjalankan jejak (dan mungkin masih), tapi saya tidak berpikir objek urutan sedang dimodifikasi secara langsung. Alasan saya percaya ini adalah bahwa tanggal modifikasi berumur beberapa hari dan menunjuk ke waktu ketika kita secara manual menaikkan nilainya untuk mencoba dan menghilangkan duplikat. (Dan masalah telah terjadi beberapa kali sejak itu.)
Adakah yang tahu apa yang menyebabkan rollback berurutan dan menggunakan kembali nilai setiap malam?
UPDATE: Untuk menjawab beberapa pertanyaan di komentar:
@@Version
:Microsoft SQL Server 2012 (SP1) - 11.0.3000.0 (X64) 19 Okt 2012 13:38:57
Buat Skrip:
CREATE SEQUENCE [schemaName].[SequenceName] AS [bigint] START WITH 410014104 INCREMENT BY 1 MINVALUE 410000000 MAXVALUE 419999999 CYCLE CACHE GO
Saya tidak memiliki Batasan Unik (tapi saya berencana untuk menggunakannya). Namun itu hanya akan membantu saya mengetahui kapan saya telah menggunakan kembali nilai. Bukan yang menyebabkan nilai-nilai diatur ulang. Saya menempatkan pekerjaan pada itu akan mendapatkan nilai baru setiap 5 menit dan simpan. Waktu dan lompatan nilai tidak mengikuti pola.
- Saya telah memeriksa Log Kejadian untuk melihat apakah ada kesalahan. Satu-satunya pemikiran yang terjadi adalah ini: http://support.microsoft.com/kb/2793634 Kami menerapkan perbaikan hari ini. Saya tidak berpikir ini terkait, tetapi bisa jadi.
sumber
@@VERSION
? Juga ada yang berubah tentang lingkungan? Ada item sambung yang melaporkan sesuatu yang serupa. OP di sana menganggap itu terkait dengan11.0.3000.0
Jawaban:
Pertama, jika Anda tidak ingin duplikat di kolom ini, sebutkan itu secara eksplisit .
(Atau Anda mungkin ingin menjadikannya sebagai kunci utama, atau mengubah indeks berkerumun, atau apa pun yang Anda ...)
Dalam kasus apa pun, meningkatkan kesalahan saat Anda membuat duplikat jauh lebih baik daripada hanya memasukkan duplikat secara membabi buta yang harus Anda tangani nanti.
Selanjutnya, pertimbangkan bahwa SEQUENCE hanyalah penghasil angka, dan secara default ia memiliki cache dengan nilai 50. Bergantung pada bagaimana transaksi Anda diatur, dan peristiwa kritis apa yang terjadi pada server, ada kemungkinan bahwa SQL Server dapat "lupa" bahwa itu menghasilkan nilai-nilai tertentu untuk Anda. Maaf tapi saya tidak tahu persis apa yang menjadi faktor kriteria dalam mereproduksi bug ini. Cara untuk mengatasi ini (sampai bug dipecahkan / dijelaskan ) adalah dengan mengubah urutan untuk digunakan
NO CYCLE
danNO CACHE
, misalnya:Catatan yang
NO CACHE
dapat mempengaruhi kinerja dan konkurensi, tetapi akan membantu menghilangkan kesenjangan, kehilangan blok dan, siapa tahu, mungkin masalah Anda juga.Anda mungkin juga ingin memverifikasi bahwa Anda menggunakan paket layanan dan CU terbaru. Pada titik ini saya merekomendasikan SP1 dan CU10 dengan 3437 ; SP2 keluar tetapi masih ada masalah kritis di sana dengan pembangunan kembali online yang dapat memengaruhi Anda .
sumber
NO CYCLE
sudah cukup. (Setidaknya itu tidak terjadi semalam.) Terima kasih atas bantuannya!