如果记录存在则插入和更新,否则不存在竞争条件
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
如果您有多个交易,您也可以为您的交易命名。
【讨论】:
以上是关于如果记录存在则插入和更新,否则不存在竞争条件的主要内容,如果未能解决你的问题,请参考以下文章