C# 如何在SQL Server中处理并行批量更新请求?
假设我有一个存储任务的表,它可以有一个类似“to do”、“processing”和“done”的状态。由于我有多个客户机负责处理这些任务,所以我希望确保只有一个客户机抓取某个任务来处理它 为了避免太多的数据库请求,客户机在一个请求中获得要处理的多个(10100,…)任务 在SQL Server中实现这一点的最佳方法是什么C# 如何在SQL Server中处理并行批量更新请求?,c#,sql-server,multithreading,locking,C#,Sql Server,Multithreading,Locking,假设我有一个存储任务的表,它可以有一个类似“to do”、“processing”和“done”的状态。由于我有多个客户机负责处理这些任务,所以我希望确保只有一个客户机抓取某个任务来处理它 为了避免太多的数据库请求,客户机在一个请求中获得要处理的多个(10100,…)任务 在SQL Server中实现这一点的最佳方法是什么 我是否可以选择要完成的任务并同时更新它们,以将它们标记为“正在处理”呢?让我们假设存储任务的表与此类似: CREATE TABLE [TASKQUEUE] ( [TA
我是否可以选择要完成的任务并同时更新它们,以将它们标记为“正在处理”呢?让我们假设存储任务的表与此类似:
CREATE TABLE [TASKQUEUE]
(
[TASKID] INT ,
[CLIENTID] INT ,
[STATE] TINYINT ,
[DESCRIPTION] VARCHAR(100)
)
GO
TASKID是主键,
CLIENTID将一行标记为由特定客户端处理,
状态将包含一个可能的状态(“待办”、“处理”、“完成”)
然后,抓取任务的存储过程可以是:
CREATE PROCEDURE [GETTASK]
@MAX INT = 100 ,
@CLIENTID INT ,
@STATE TINYINT
-- @STATE:
-- 1: to do
-- 2: processing
-- 3: done
AS
BEGIN
UPDATE [TASKQUEUE]
SET [CLIENTID] = @CLIENTID ,
[STATE] = 2
WHERE [TASKID] IN (
SELECT TOP(@MAX) [TASKID]
FROM [TASKQUEUE]
WHERE [STATE] = 1 AND [CLIENTID] IS NULL);
SELECT [TASKID] , [DESCRIPTION]
FROM [TASKQUEUE]
WHERE [CLIENTID] = @CLIENTID AND [STATE] = 2;
END;
如果您使用的是读取提交隔离级别(默认)或更高级别,则更新将负责多个同时请求的同步。没有两个请求能够同时更新相同的TASKQUEUE行。
如果第二个请求尝试在第一个请求的更新之后立即调用UPDATE,则行已被修改,并且不会被检索,其中[STATE]=1,[CLIENTID]为NULL
子句