Tsql 插入过程失败,即使我们先检查是否存在

Tsql 插入过程失败,即使我们先检查是否存在,tsql,Tsql,因此,当我们在数据库中已经存在相同的记录之后运行此操作时,它会失败。但是我们有如果不存在就是因为这个确切的原因。如果它找到一条记录,为什么要尝试插入?如果那对列(pt\u tr\u transaction\u id,pt\u pj\u project\u id)是唯一的,为什么不在这两列上放一个唯一的索引呢?将其与该索引上的IGNORE\u DUP\u KEY选项相结合,您将拥有一个 防止插入任何重复项 当遇到重复时,不要呕吐(抛出异常)——它只是被默默地吞下 您的这个检查很容易失败,因为您

因此,当我们在数据库中已经存在相同的记录之后运行此操作时,它会失败。但是我们有
如果不存在
就是因为这个确切的原因。如果它找到一条记录,为什么要尝试插入?

如果那对列
(pt\u tr\u transaction\u id,pt\u pj\u project\u id)
是唯一的,为什么不在这两列上放一个唯一的索引呢?将其与该索引上的
IGNORE\u DUP\u KEY
选项相结合,您将拥有一个

  • 防止插入任何重复项
  • 当遇到重复时,不要呕吐(抛出异常)——它只是被默默地吞下

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

您确定没有在其中一个参数上传递
NULL
值吗?肯定。这真的很奇怪,这很奇怪。该表上没有挂起的事务?我认为这可能与我在下面看到的并发内容有关。
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