我有一个使用Entity Framework 6.1的Windows服务,该服务从Queue表读取。我获取状态为待处理的最早记录,然后将状态更改为处理中,完成后将状态更改为完成。
我需要允许扩展。我将使用许多这些Windows服务来处理队列表。一个实例有可能会在另一个实例获得最旧记录之后,但在将其设置为 InProcess 之前,会获取最旧的记录。在这种情况下,他们都将在同一条记录上工作。
我想我可以通过行锁定来做到这一点,但是EF不支持。
有什么想法要实现吗?
答案 0 :(得分:0)
我会从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