istället för under kod
BEGIN
INSERT INTO EmailsRecebidos (De, Assunto, Data)
VALUES (@_DE, @_ASSUNTO, @_DATA)
WHERE NOT EXISTS ( SELECT * FROM EmailsRecebidos
WHERE De = @_DE
AND Assunto = @_ASSUNTO
AND Data = @_DATA);
END
ersätt med
BEGIN
IF NOT EXISTS (SELECT * FROM EmailsRecebidos
WHERE De = @_DE
AND Assunto = @_ASSUNTO
AND Data = @_DATA)
BEGIN
INSERT INTO EmailsRecebidos (De, Assunto, Data)
VALUES (@_DE, @_ASSUNTO, @_DATA)
END
END
Uppdaterad: (tack till @Marc Durdin för att du pekade)
Observera att under hög belastning kommer detta fortfarande ibland att misslyckas, eftersom en andra anslutning kan klara testet OM INTE FINNS innan den första anslutningen exekverar INSERT, d.v.s. ett race-tillstånd. Se stackoverflow.com/a/3791506/1836776 för ett bra svar på varför ens inslag i en transaktion inte löser detta.