SQL Server更新-实现增量值
我有一个表(称为SQL Server更新-实现增量值,sql,sql-server,sql-update,Sql,Sql Server,Sql Update,我有一个表(称为mytable),它包含两列:ID和counter 我想实现一个增量计数器来更新计数器值。每次增加1 基本上,它应该这样运行: UPDATE mytable SET [counter] = [counter] + 1 WHERE ID = @theID UPDATE mytable SET [counter] = (Select @@ROWCOUNT From mytable where ID=@theID) + 1 WHERE ID=@theID 我编写了一个小
mytable
),它包含两列:ID
和counter
我想实现一个增量计数器来更新计数器
值。每次增加1
基本上,它应该这样运行:
UPDATE mytable
SET [counter] = [counter] + 1
WHERE ID = @theID
UPDATE mytable
SET [counter] = (Select @@ROWCOUNT From mytable where ID=@theID) + 1
WHERE ID=@theID
我编写了一个小应用程序,它运行一个从1到10000的for循环,并检查我的计数器最后是否等于10000
对于单线程应用程序,它运行良好。但是,当我运行应用程序的几个实例时,计数器的值小于预期值
例如,运行应用程序3次,最后计数器的值为29980(预计30000)
我知道这是一个并发问题。所以,我检查了一下,似乎SQLUPDATE
语句是“原子”命令。所以,我想同一个命令不可能同时发生两次
这是真的吗?那么,我是如何在我的计数器列中丢失一些值的呢
如果没有,还有什么问题?您可以更新代码以使用@ROWCOUNT
检查它是否工作正常,如下所示:
UPDATE mytable
SET [counter] = [counter] + 1
WHERE ID = @theID
UPDATE mytable
SET [counter] = (Select @@ROWCOUNT From mytable where ID=@theID) + 1
WHERE ID=@theID
我很好奇为什么会发生这种事。。。但是如果你担心同一个计数器被读取了两次,你可以尝试锁上桌子
BEGIN TRANSACTION
DECLARE @Counter INT;
SELECT @Counter = [Counter]
FROM mytable WITH ( TABLOCK, HOLDLOCK )
UPDATE mytable
SET Counter = @Counter + 1;
COMMIT TRANSACTION
您对更新
是原子的理解是正确的。我想我们也需要看看代码。为什么不直接用IDENTITY为你做增量呢?Dane,请解释一下?他问为什么你的ID列不是IDENTITY列?显示你的多线程应用程序代码。