'即使在事务中,也无法在对象'异常中插入重复的键行

时间:2017-12-28 18:37:26

标签: sql sql-server-2008 unique-index

我有几个代码片段,即使我希望它不会抛出它,也会引发上述异常。

摘录1:

;WITH CompanyCTE AS
(  SELECT DISTINCT Company
   FROM @Companies c)
MERGE INTO dbo.Company WITH (UPDLOCK) d
    USING CompanyCTE s ON d.Company=s.CompanyName
WHEN NOT MATCHED BY TARGET THEN
    INSERT(Company, UpdateDate)
    VALUES(s.CompanyName, GETDATE())
;

摘录2:

UPDATE tblSESSION
SET SESSION_TOKEN = @SESSION_TOKEN
WHERE USER_TOKEN = @USER_TOKEN

IF(@@ROWCOUNT = 0)
BEGIN
    INSERT INTO tblSESSION(USER_TOKEN, SESSION_TOKEN) 
    SELECT @USER_TOKEN AS USER_TOKEN, @SESSION_TOKEN AS SESSION_TOKEN           
    WHERE NOT EXISTS(SELECT 1 FROM tblSESSION WHERE USER_TOKEN = 
                         @USER_TOKEN)
END

我删除了不相关的代码,但是:

  1. 这些都在交易中
  2. sprocs在顶部有“SET TRANSACTION ISOLATION LEVEL READ COMMITTED”。
  3. 错误信息是这样的:

    无法在对象dbo.Company中插入具有唯一索引“IX_Company_Name”的重复键行。重复键值为(XYZ公司)。

    我假设即使我的sproc同时被调用具有相同的值,检查应该能够防止重复的密钥插入尝试。我无法在开发环境中重现它,但我在生产日志中收到错误消息。 关于支票无法处理的可能案例的任何见解?

0 个答案:

没有答案