我需要做的是写两个不同来源的同一行(程序/方法/服务)。
进入的第一个调用会创建行,而下一个调用只会更新它。
这需要在没有任何锁定的情况下发生。如果可能的话,我希望能够调用源一次(不是通过处理锁定错误反复执行)
这里有点我现在在第三个过程中,其他人调用并只插入一行(只插入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弹出,但我不确定这是否有用或我应该如何使用它。
答案 0 :(得分:0)
看看Michael J Swarts'文章Mythbusting: Concurrent Update/Insert Solutions。这将向您展示所有可能的做法和不做。包括实际合并并不的事实在解决并发问题方面做得很好。