我有一个表(称为textarea
),其中包含两列:mytable
和ID
。
我想实现一个增量计数器来更新counter
值。每次增加1。
基本上,它应该像这样运行:
counter
我编写了一个小应用程序,运行1到10,000的for循环,并检查我的计数器最后是否等于10,000。
使用单线程应用程序,它运行正常。但是,当我运行我的应用程序的几个实例时,UPDATE mytable
SET [counter] = [counter] + 1
WHERE ID = @theID
值小于预期。
例如,运行应用程序3次,最后counter
的值为29,980(预期为30,000)。
我知道这是一个并发问题。所以,我检查过,似乎SQL counter
语句是“原子”命令。所以,我猜这个命令不能同时发生两次。
这是真的吗?那么,我如何在UPDATE
列中丢失一些值?
如果没有,还有什么问题可以解决?
答案 0 :(得分:0)
我很好奇为什么会发生这种情况......但是如果你担心同一个计数器已被读过两次,你可以尝试锁定表格。
BEGIN TRANSACTION
DECLARE @Counter INT;
SELECT @Counter = [Counter]
FROM mytable WITH ( TABLOCK, HOLDLOCK )
UPDATE mytable
SET Counter = @Counter + 1;
COMMIT TRANSACTION
答案 1 :(得分:-1)
您可以更新代码以使用@@ ROWCOUNT。
检查它是否正常工作:
UPDATE mytable
SET [counter] = (Select @@ROWCOUNT From mytable where ID=@theID) + 1
WHERE ID=@theID