这是个经典例子呀。 在2008下,使用merge语句可以很好的解决这个问题,具体用法参照联机文档吧。如果是2000的,高并发下,要考虑2点,一个是阻塞的情况,一个是一致性的情况。阻塞方面倒不用考虑很多,上述例子就可以了。而并发还是容易出现数据不一致的情况。比如两个会话S1,S2,同时运行,都去select判断记录不存在,返回是同样值的,要么同时插入,要么同时更新,从而造成不一致的情况。可以参考下面的这个语句看看 begin tran update tb with (serializable) set id = 34 where id = 33 if @@rowcount = 0 begin insert tb (id, name) values (34,'aa') end commit tran 通过添加serializable提示,防止数据不一致的情况。。楼主可以参考下。
select 33,'aaa' where not exists(select 1 from tb where id=33)
if @@rowcount=0
update tb set name='aaa' where id=33
这样并发性应该好一些
同样id先insert就返回@@rowcount=1,后insert就@@rowcount=0,则update
这是个经典例子呀。
在2008下,使用merge语句可以很好的解决这个问题,具体用法参照联机文档吧。如果是2000的,高并发下,要考虑2点,一个是阻塞的情况,一个是一致性的情况。阻塞方面倒不用考虑很多,上述例子就可以了。而并发还是容易出现数据不一致的情况。比如两个会话S1,S2,同时运行,都去select判断记录不存在,返回是同样值的,要么同时插入,要么同时更新,从而造成不一致的情况。可以参考下面的这个语句看看
begin tran
update tb with (serializable)
set id = 34
where id = 33
if @@rowcount = 0
begin
insert tb (id, name)
values (34,'aa')
end
commit tran
通过添加serializable提示,防止数据不一致的情况。。楼主可以参考下。