首页 > 解决方案 > 扩展读取队列表的实体框架项目

问题描述

我有一个使用 Entity Framework 6.1 的 Windows 服务,它从 Queue 表中读取数据。我抓取状态为Pending的最旧记录,然后将状态更改为InProcess,完成后将状态更改为Complete

我需要允许缩放。我将有许多这样的 Windows 服务处理队列表。一个实例有可能会在另一个实例获取最旧的记录之后,但在将其设置为InProcess之前获取它。在这种情况下,他们都将在同一条记录上工作。

我想我可以通过行锁定来做到这一点,但 EF 不支持。

知道如何做到这一点吗?

标签: sql-serverentity-framework-6

解决方案


我会从 EF 调用一个存储过程,它可以一次性完成所有操作。使用事务强制锁定更新的行。

过程代码示例:

DECLARE @myID TABLE (id INT)
BEGIN TRAN

;WITH orderCTE AS
(
    SELECT TOP 1 id,status
    FROM myTable T
    WHERE status='Pending'
    ORDER BY someDateValue ASC
)
UPDATE orderCTE SET status='inProcess'
OUTPUT inserted.id into @myID(id)

SELECT id
FROM @myID
COMMIT TRAN

这是一个带数据的功能示例:

DECLARE @test TABLE (id int, [status] varchar(100), someDateValue DATETIME)
INSERT INTO @test 
VALUES (1,'Pending', GETDATE())

DECLARE @myID TABLE (id INT)
BEGIN TRAN

;WITH orderCTE AS
(
    SELECT TOP 1 id,[status]
    FROM @test T
    WHERE status='Pending'
    ORDER BY someDateValue ASC
)
UPDATE orderCTE SET [status]='inProcess'
OUTPUT inserted.ID into @myID(id)

SELECT id
FROM @myID
COMMIT TRAN

SELECT * FROM @test

推荐阅读