Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/282.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
C# 如何在SQL Server中处理并行批量更新请求?_C#_Sql Server_Multithreading_Locking - Fatal编程技术网

C# 如何在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

假设我有一个存储任务的表,它可以有一个类似“to do”、“processing”和“done”的状态。由于我有多个客户机负责处理这些任务,所以我希望确保只有一个客户机抓取某个任务来处理它

为了避免太多的数据库请求,客户机在一个请求中获得要处理的多个(10100,…)任务

在SQL Server中实现这一点的最佳方法是什么


我是否可以选择要完成的任务并同时更新它们,以将它们标记为“正在处理”呢?

让我们假设存储任务的表与此类似:

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
子句