如果记录存在则插入和更新,否则不存在竞争条件

Posted

技术标签:

【中文标题】如果记录存在则插入和更新,否则不存在竞争条件【英文标题】:insert and update if a record exists else not , race condition 【发布时间】:2011-04-14 11:32:57 【问题描述】:
if exists (select itemcode from item where itemcode=1120)
update item 
set itemname = 'laptop'
where itemcode = 1120

else 
insert into item (itemcode,itemname)
values (1120,'laptop')

它将被多个用户使用。此查询是否会给出竞争条件。 如果是,那么如何?我应该用什么来代替这个查询?

【问题讨论】:

Only inserting a row if it's not already there 的可能重复项 另请阅读technet.microsoft.com/en-us/library/bb522522.aspx 实际上我链接到的副本不是真正的副本。我看到你正在做一个upsert。是的,会有比赛条件。在 SQL Server 2008 中,您将使用 Merge。对于 2005 年,请参阅 ***.com/questions/2522379/… @AndersUP - 是的,我也发现了这一点,并在the possible dupe中链接到那篇文章 【参考方案1】:

您可以为此使用transaction。确保在单个事务中锁定所有需要的表,然后释放它们。

begin transaction

begin try

    if exists (select itemcode from item where itemcode=1120)
    BEGIN
    update item 
    set itemname = 'laptop'
    where itemcode = 1120
    END

    else 
    BEGIN
    insert into item (itemcode,itemname)
    values (1120,'laptop')
    END

    commit transaction

end try

begin catch
  raiserror('Message here', 16, 1)
  rollback transaction
end catch

如果您有多个交易,您也可以为您的交易命名。

【讨论】:

以上是关于如果记录存在则插入和更新,否则不存在竞争条件的主要内容,如果未能解决你的问题,请参考以下文章

sql server 判断记录存在更新不存在插入

如果 id 存在则更新,否则插入 (ODBC)

mysql:如果不存在则插入记录,否则返回记录的ID

如果存在则更新,否则插入[重复]

SQL 查询 - 如果存在则更新,否则插入

Mysql插入数据:不存在则插入,存在则跳过或更新