即使我们先检查存在,插入proc也会失败

时间:2011-04-04 19:24:39

标签: tsql

ALTER PROCEDURE [dbo].[spWeb_TransactionProjectUpdate]
    @transactionId              INT,
    @projectId                  INT
AS

IF NOT EXISTS(SELECT * FROM dbo.com_project_transaction_link WHERE pt_tr_transaction_id = @transactionId AND pt_pj_project_id = @projectId)
BEGIN

    INSERT INTO dbo.com_project_transaction_link(pt_tr_transaction_id, pt_pj_project_id) VALUES (@transactionId, @projectId)

END

因此,当我们在数据库中已经存在相同记录之后运行它时,它将失败。但出于这个原因,我们有IF NOT EXISTS。如果找到记录,为什么会尝试插入?

1 个答案:

答案 0 :(得分:1)

如果那对列(pt_tr_transaction_id, pt_pj_project_id)是唯一的,为什么不在这两列上放一个UNIQUE INDEX?将其与该索引上的IGNORE_DUP_KEY选项相结合,您将得到一个

的索引
  • 可防止插入任何重复项
  • 遇到重复时,
  • 没有barf(抛出异常) - 它只是被静默吞噬

这种检查很容易失败,因为你没有做任何事情来阻止两个客户同时运行;两者都可以首先检查该行是否存在并返回false,然后两者都可以继续插入这些值。您的检查对于并发执行是不安全的。