Hinzufügen von max (Wert) +1 in neue Zeile, kann das ein Problem sein?

In einer SQL server-Tabelle habe ich die folgenden 2 Spalten:

RowId : Primärschlüssel, Numar, Identitätsspalte und Auto-Insert.
MailId : Nicht-Schlüssel, Numar-, Nicht-Identität und Nicht-Auto-Insert.

Mail-ID kann dupliziert werden. Im Falle eines neuen MailId werde ich max (MailId) +1 überprüfen und in eine neue Zeile insert und bei Duplizierungswert als Parameter kommen.

Logik sieht gut aus, aber hier ist ein Problem, das ich gerade in Erwägung gezogen habe (doch Chacnes of Accurance sind ver low). Gleichzeitig gibt es zwei verschiedene neue MailId-Anfragen. Kann dies einen logischen Fehler verursachen? Zum Beispiel, wenn Code überprüft wurde max (MailId) +1 war 101 und ich habe es in einer Variable gespeichert, aber möglicherweise vor dem nächsten Insert-Statement führt einen neuen datasatz in die Tabelle eingefügt. Jetzt max (MailId) +1 in Tabelle wird 102 sein, aber Wert in Variable wird 101?

Irgendein Vorschlag bitte Ich möchte diese Störung auch beherrschen.

BEARBEITEN

(Ich benutze keine Identität (1,1), weil ich auch kundenspezifische Werte passieren muss)

Warum würdest du ein benutzerdefiniertes Identity , wenn es so ein tolles schon in SQL server gibt?

Verwenden Sie einfach INT Identity (1,1) für Ihr ID-Feld und es wird automatisch jedes Mal, wenn eine Zeile eingefügt wird, automatisch erhöht. Es behandelt auch Parallelität viel besser als so ziemlich alles, was man manuell implementieren könnte.

BEARBEITEN:

Beispiel eines manuellen ID-Wertes:

 SET IDENTITY_INSERT MyTable ON INSERT INTO MyTable (IdField, Col1, Col2, Col3,...) VALUES (1234, 'Col1', 'Col2', 'Col3',...) SET IDENTITY_INSERT MyTable OFF 

Sie müssen eine explizite INSERT für das INSERT .

Verwenden Sie OUTPUT auf Ihrem deployment, um sicherzustellen, dass Sie den richtigen Wert haben. Wenn Sie insert und dann MAX wählen, ist es möglich, dass jemand "schleichen" könnte und am Ende mit Duplizierung. Das heißt, du steckst MAX + 1 ein, zur selben time fügt jemand anderes MAX + 1 ein, dann wählst du MAX aus und wähle MAX aus, ihr habt den gleichen Wert. Wenn Sie INSERT und OUTPUT verwenden, werden Sie sicher sein, dass Sie einzigartig sind. Dies ist nur selten ein Problem, aber wenn Sie viel Aktivität haben, kann es passieren (aus der Erfahrung sprechen).

BEARBEITEN

 USE AdventureWorks2008R2; GO DECLARE @MyTableVar table( EmpID int NOT NULL, OldVacationHours int, NewVacationHours int, ModifiedDate datetime); UPDATE TOP (10) HumanResources.Employee SET VacationHours = VacationHours * 1.25, ModifiedDate = GETDATE() OUTPUT inserted.BusinessEntityID, deleted.VacationHours, inserted.VacationHours, inserted.ModifiedDate INTO @MyTableVar; --Display the result set of the table variable. SELECT EmpID, OldVacationHours, NewVacationHours, ModifiedDate FROM @MyTableVar; GO --Display the result set of the table. SELECT TOP (10) BusinessEntityID, VacationHours, ModifiedDate FROM HumanResources.Employee; GO