Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/83.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
SQL Server更新-实现增量值_Sql_Sql Server_Sql Update - Fatal编程技术网

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)

我知道这是一个并发问题。所以,我检查了一下,似乎SQL
UPDATE
语句是“原子”命令。所以,我想同一个命令不可能同时发生两次

这是真的吗?那么,我是如何在我的
计数器
列中丢失一些值的呢


如果没有,还有什么问题?

您可以更新代码以使用@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列?显示你的多线程应用程序代码。