ich eine gespeicherte Prozedur ausgeführt wird, die Werte meine temporäre Tabelle und fügt sie in die Datenbank wie so wählt:INSERT INTO .. SELECT .. eindeutige Einschränkung Verletzung
INSERT INTO emails (EmailAddress) (
SELECT
DISTINCT eit.EmailAddress
FROM #EmailInfoTemp eit
LEFT JOIN emails ea
ON eit.EmailAddress = ea.EmailAddress
WHERE ea.EmailAddressID IS NULL )
In seltenen Fällen (~ einmal alle paar von Stunden auf einem Server, der Tausende von Anfragen pro Minute behandelt), dann erhalte ich einen eindeutigen Constraint-Fehler "Verletzung der UNIQUE KEY-Einschränkung" in einem Index der EmailAddress-Spalte.
Ich kann bestätigen, dass ich keine doppelten Werte übergebe. Selbst wenn ich es wäre, sollte es von der DISTINCT aufgefangen werden.
-SQL Server 2008 -Stored proc + nicht mit Transaktionen + JDBC Callablestatement
Könnte es passieren, dass zwischen dem SELECT und der nachfolgenden INSERT, wenn ein weiterer Teilnehmer an der gleichen/verschiedenen gespeicherte Prozedur war, die eine INSERT abgeschlossen mit ähnlichen Daten? Wenn ja, was wäre der beste Weg, dies zu verhindern?
Einige Ideen: Wir haben viele doppelte Instanzen von "Clients", die mit diesem einen SQL Server auf einmal in der Produktion kommunizieren, so meine erste Reaktion war ein Nebenläufigkeitsproblem, aber ich kann nicht scheinen, es selbst zu replizieren. Das ist die beste Vermutung, die ich hatte, aber es ist nirgends so weit gegangen. Dies geschieht nicht in unserer Staging-Umgebung, in der die Last im Vergleich zur Produktionsumgebung unbedeutend ist. Das war der Hauptgrund, warum ich angefangen habe, Nebenläufigkeitsprobleme zu untersuchen.
Ein NULL-Wert in EmailAddress auf beiden Seiten könnte die eindeutige Schlüsseleinschränkung verletzen. Wenn diese Spalte nullfähig ist, können Sie die Einfügung als "nicht vorhanden" umschreiben. –
Guter Punkt. Ich überprüfe im Code Nullen, aber ich nehme an, ich könnte es nochmal in SQL überprüfen. –