记录存在则更新,不存在则插入,在高并发下应该怎么写?谢谢!

解决方案 »

  1.   

    insert tb (id,name)
    select 33,'aaa' where not exists(select 1 from tb where id=33)
    if @@rowcount=0
    update tb set name='aaa' where id=33
    这样并发性应该好一些
      

  2.   

    在高并发下 大家不都insert tb (id,name)了吗?
      

  3.   

    并发是一个极端的概念,大家都insert并不一定会发生并发。
      

  4.   

    无论如何并发,总会有先insert,后insert 
    同样id先insert就返回@@rowcount=1,后insert就@@rowcount=0,则update
      

  5.   

    你想插入数据 不insert插不进去
      

  6.   


    这是个经典例子呀。
    在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提示,防止数据不一致的情况。。楼主可以参考下。