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