同时写入同一行而不锁定?

时间:2017-10-11 10:26:03

标签: sql sql-server

我需要做的是写两个不同来源的同一行(程序/方法/服务)。

进入的第一个调用会创建行,而下一个调用只会更新它。

这需要在没有任何锁定的情况下发生。如果可能的话,我希望能够调用一次(不是通过处理锁定错误反复执行)

这里有点我现在在第三个过程中,其他人调用并只插入一行(只插入xyz)或如果有一行则返回true。 这样,两个呼叫同时到达的速度很快且不太可能。

    IF EXISTS(SELECT * FROM [dbo].[Wait] WHERE xyx= @xyz)
    BEGIN
           -- The row exists because the other datasource
           -- has allready inserted a row with the same xyz  
           --  UPDATE THE ROW WITH DATA COMING IN    
    END
    ELSE
    BEGIN   
           -- No row with value xyz exists so we INSERT it with
           -- the extra data.
    END

我知道它不保证没有锁定。但在我的情况下,它们实际上不太可能同时到达,即使它们是用户控制的,所以它们会出错并且会再次尝试。但我不想解决这个问题。

我一直看到Row Versioning弹出,但我不确定这是否有用或我应该如何使用它。

The problem in an image

1 个答案:

答案 0 :(得分:0)

看看Michael J Swarts'文章Mythbusting: Concurrent Update/Insert Solutions。这将向您展示所有可能的做法和不做。包括实际合并并不的事实在解决并发问题方面做得很好。