我编写了多线程应用程序,每个线程都调用一个 sql server 过程。我需要保护一行不被多个线程占用我希望每一行只被一个线程占用我使用了这个代码:
CREATE PROCEDURE GetRow
@ThreadID int
AS
BEGIN
DECLARE @rowID int;
SELECT TOP (1) @rowID=[ID] FROM [TestTable] WHERE [ThreadID] = 0 (AND some other parameters)
IF @rowID is not NULL
BEGIN
UPDATE TOP (1) [TestTable] SET [CallCount] = [CallCount]+1,[ThreadID] = @ThreadID WHERE [ID] = @rowID
--some other codes
END
END
正如我所说,我运行应用程序,然后我的应用程序创建 10 个线程,我将 threadid 设置为仅由一个线程占用一行,但我看到一行被超过 1 个线程调用,并且大约 4-5 个线程得到一行.. 怎么可能我这样做是最好的方法,我通过这段代码解决了这个问题,我不喜欢在选择和更新中有两个相同的位置:
CREATE PROCEDURE GetRow
@ThreadID int
AS
BEGIN
DECLARE @rowID int;
UPDATE TOP (1) [TestTable] SET [CallCount] = [CallCount]+1,[ThreadID] = @ThreadID WHERE [ThreadID] = 0 (AND some other parameters)
SELECT TOP (1) @rowID=[ID] FROM [TestTable] WHERE [ThreadID] = @ThreadID (AND some other parameters)
IF @rowID is not NULL
BEGIN
--some other codes
END
END
我怎么能用顶级代码做到这一点?我应该先更新然后选择上面的代码来修复它吗?