2012-12-01 3 views
7

Ich habe noch nie zuvor gesehen, dass dies passiert, sehr merkwürdig.Odd SQL Server 2012 IDENTITY Problem

Ich habe eine lokale SQL Server 2012 Express-Datenbank, gegen die ich entwickle. Ausführen einer einfachen Testsuite mit dem TestDrive-Plug-In und Zugriff auf die Datenbank mit EF v5.

Ich habe gerade einen Test ausgeführt, der einen Datensatz in die Datenbank einfügt. Ich hatte 9 Zeilen in der Tabelle von ID 1-9. Die nächste Einfügung und die ID sprangen genau um 10000 !!!!

die ID-Spalte geht:

1, 2, 3, 4, 5, 6, 7, 8, 9, 10009 

ich nicht weiß Einsätze auch die ID erhöht, aber ich kann garantieren, dass 10.000 nicht in den 5 Sekunden einzufügen versäumen zwischen Test läuft ...

Die Tabellenstruktur ist wirklich einfach, eine Reihe von Spalten und eine automatisch inkrementierende Identitätsspalte vom Typ bigint (lang), keine SPs, Trigger oder irgendeinen anderen programmatischen Inhalt.

[Id] [bigint] IDENTITY(1,1) NOT NULL, 

Sehr verwirrend, hat jemand anderes dieses Ereignis gesehen?

+0

Ich sehe nicht, wie es meinen Code sein kann. Der Code tut nichts mit der ID und es ist ein INSERT-Befehl, nicht ein UPDATE-Befehl und wenn der INSERT versucht, eine ID anzuwenden, würde es einfach den ID-Wert ignorieren ... – Jammer

+0

Scheint 2012 ein Bug wie er ist hier auch von anderen berichtet ... http://connect.microsoft.com/SQLServer/feedback/details/743300/identity-column-jumps-by-seed-value#tabs Ich habe gerade ein Protokoll für diese als hinzugefügt Nun ... – Jammer

+0

Scheint, es wird durch einen Neustart der SQL-Engine verursacht ... aber warum es 10000 springen würde, wenn mein Seed 1 ist, ist ein bisschen verrückt ... – Jammer

Antwort

2

Diese blog post enthält einige zusätzliche Details. Es sieht so aus, als wäre 2012 identity als Sequenz implementiert. Und standardmäßig hat eine Sequenz einen Cache. Wenn der Cache verloren geht, verlieren Sie die Sequenzwerte im Cache.

Die vorgeschlagene Lösung ist eine Sequenz mit no cache zu erstellen:

CREATE SEQUENCE TEST_Sequence 
    AS INT 
    START WITH 1 
    INCREMENT BY 1 
    NO CACHE 

Soweit ich sehen kann, ist die Reihenfolge hinter einer Identitätsspalte nicht sichtbar ist. Sie können die Eigenschaften nicht ändern, um das Caching zu deaktivieren.

Um dies mit Entity Framework zu verwenden, können Sie den Primärschlüssel StoredGeneratedPattern auf Computed setzen. Dann könnten Sie die Identität Server-Seite in einem instead of insert Trigger erzeugen:

if exists (select * from sys.sequences where name = 'Sequence1') 
    drop sequence Sequence1 
if exists (select * from sys.tables where name = 'Table1') 
    drop table Table1 
if exists (select * from sys.triggers where name = 'Trigger1') 
    drop trigger Trigger1 
go 
create sequence Sequence1 
    as int 
    start with 1 
    increment by 1 
    no cache 
go 
create table Table1 
    (
    id int primary key, 
    col1 varchar(50) 
    ) 
go 
create trigger Trigger1 
    on Table1 
    instead of insert 
as 
insert Table1 
     (ID, col1) 
select next value for Sequence1 
,  col1 
from inserted 
go 
insert Table1 (col1) values ('row1'); 
insert Table1 (col1) values ('row2'); 
insert Table1 (col1) values ('row3'); 

select * 
from Table1 

Wenn Sie eine bessere Lösung finden, lassen Sie mich wissen :)

+0

Ahhh ... das ist interessant. Ich werde sehen, ob ich diesen No-Cache-Ansatz mit EF arbeiten kann ... – Jammer

+0

Hmm ...Das sieht alles ein wenig unordentlich aus :(Ich werde sehen, ob ich etwas darüber finden kann und zurück melden – Jammer

+0

Eigentlich weißt du was. Ich bin mir nicht einmal sicher, ob es mich interessiert, es ist ein großes Ding, also werde ich es nicht tun Ich benutze meine Ids in keiner Weise, die davon abhängig ist, wie sie erstellt werden, und wenn es nur passiert, wenn SQLServer in der Produktion neu gestartet wird, wird das nicht oft sein (berühmte letzte Worte!) ... zumindest ich bin jetzt nicht besorgt, vielleicht geht es zurück zu 2008 R2 für die reale Produktion Bereitstellung ... – Jammer

0

Wenn Sie nennen „Checkpoint“ Befehl nach jeder INSERT-Abfrage, Es wird dein Problem lösen.

Für weitere Informationen lesen Sie bitte Checkpoint in SQL Server

+0

Es gibt etwa 300 einfügen Abfragen in der DB würde nicht funktionieren MS muss dieses Problem beheben. –