Ich habe eine Sequenz, die Tracking-Nummern für Objekte in meinem System generiert. Es hatte schon seit einiger Zeit gut funktioniert.
Letzte Woche haben wir festgestellt, dass die Werte wieder verwendet werden.
Was zu passieren scheint, ist, dass es zu verschiedenen Zeitpunkten am Abend auf einen Wert zurückgesetzt wird, den es am Vortag hatte. Ab diesem Punkt werden dann weiterhin Werte generiert.
So könnte ich zum Beispiel so etwas bekommen:
10112
10113
10114
10115
10116
10117
10118
10113
10114
10115
10116
...
Es scheint kein Muster zu geben, wann es passiert, wie lange es zwischen der ersten und der zweiten Verwendung dauert (nur 10 Minuten oder mehrere Stunden) oder wie viele zurückgesetzt werden (nur 1 und mehrere hundert).
Ich habe darüber nachgedacht, einen Trace auszuführen (und kann es immer noch), aber ich glaube nicht, dass das Sequenzobjekt direkt geändert wird. Der Grund, warum ich glaube, ist, dass das Änderungsdatum mehrere Tage alt ist und auf eine Zeit verweist, in der wir den Wert manuell erhöht haben, um zu versuchen, Duplikate zu entfernen. (Und das Problem ist seitdem mehrmals aufgetreten.)
Hat jemand eine Vorstellung davon, was jeden Abend zu einem Rollback und einer Wiederverwendung von Sequenzwerten führen kann?
UPDATE: Um einige Fragen in den Kommentaren zu beantworten:
@@Version
::Microsoft SQL Server 2012 (SP1) - 11.0.3000.0 (X64) 19. Oktober 2012, 13:38:57 Uhr
Skript erstellen:
CREATE SEQUENCE [schemaName].[SequenceName] AS [bigint] START WITH 410014104 INCREMENT BY 1 MINVALUE 410000000 MAXVALUE 419999999 CYCLE CACHE GO
Ich habe keine eindeutige Einschränkung (aber ich habe vor, eine anzuziehen). Dies hilft mir jedoch nur zu wissen, wann ich einen Wert wiederverwendet habe. Nicht, was dazu führte, dass die Werte zurückgesetzt wurden. Ich habe einen Job vergeben, der alle 5 Minuten einen neuen Wert erhält und ihn spart. Die Zeiten und Wertsprünge folgen keinem Muster.
- Ich habe die Ereignisprotokolle überprüft, um festzustellen, ob ein Fehler vorliegt. Der einzige Gedanke, der passiert, ist folgender: http://support.microsoft.com/kb/2793634 Wir wenden das Update heute an. Ich denke nicht, dass diese verwandt sind, aber es könnte sein.
quelle
@@VERSION
? Hat sich auch etwas an der Umwelt geändert? Es gibt ein Verbindungselement, das etwas Ähnliches meldet. Das OP dort rechnet damit, dass es in Verbindung gebracht wurde11.0.3000.0
Antworten:
Wenn Sie in dieser Spalte keine Duplikate möchten, geben Sie dies zunächst explizit an .
(Oder Sie möchten dies möglicherweise zum Primärschlüssel machen oder den Clustered-Index ändern oder was haben Sie ...)
In jedem Fall ist es weitaus besser, beim Generieren eines Duplikats einen Fehler auszulösen, als nur blind ein Duplikat einzufügen, mit dem Sie sich später nur noch befassen müssen.
Stellen Sie sich als Nächstes vor, dass eine SEQUENCE nur ein Zahlengenerator ist und standardmäßig einen Cache mit 50 Werten hat. Abhängig davon, wie Ihre Transaktionen eingerichtet sind und welche anderen kritischen Ereignisse auf einem Server auftreten, kann SQL Server möglicherweise "vergessen", dass bestimmte Werte für Sie generiert wurden. Entschuldigung, aber ich weiß nicht genau, welche Kriterien bei der Reproduktion dieses Fehlers eine Rolle spielen. Der Weg, dies zu umgehen (bis der Fehler behoben / erklärt ist ), besteht darin, die zu verwendende Reihenfolge zu ändern
NO CYCLE
undNO CACHE
z.Beachten Sie, dass
NO CACHE
dies die Leistung und Parallelität beeinträchtigen kann, aber dazu beiträgt, Lücken, verlorene Blöcke und, wer weiß, möglicherweise auch Ihr Problem zu beseitigen.Möglicherweise möchten Sie auch überprüfen, ob Sie das neueste Service Pack und die neueste CU verwenden. An dieser Stelle empfehle ich SP1 und CU10 mit 3437 ; SP2 ist nicht verfügbar , aber es gibt immer noch ein kritisches Problem mit Online-Neuerstellungen, das Sie betreffen kann .
quelle
NO CYCLE
ausreichte , es nur mit einzustellen. (Zumindest ist es letzte Nacht nicht passiert.) Danke für die Hilfe!