以下のコードの代わりに
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
に置き換えます
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
更新: (ポインティングしてくれた@Marc Durdinに感謝します)
高負荷では、最初の接続がINSERTを実行する前に、2番目の接続がIF NOT EXISTSテストに合格する可能性があるため、これが失敗する場合があることに注意してください。つまり、競合状態です。トランザクションをラップしても解決しない理由については、stackoverflow.com / a/3791506/1836776を参照してください。