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
。如果找到记录,为什么会尝试插入?
答案 0 :(得分:1)
如果那对列(pt_tr_transaction_id, pt_pj_project_id)
是唯一的,为什么不在这两列上放一个UNIQUE INDEX?将其与该索引上的IGNORE_DUP_KEY
选项相结合,您将得到一个
这种检查很容易失败,因为你没有做任何事情来阻止两个客户同时运行;两者都可以首先检查该行是否存在并返回false
,然后两者都可以继续插入这些值。您的检查对于并发执行是不安全的。