C# 是否可以使用带有SKIP LOCKED命令的数据库优先EF 6?
我使用SQL表作为作业队列,非常类似于本文: 我的问题是,我使用的是EntityFramework6和DatabaseFirst代码,从我可以看出,EF6不支持skip-locked命令。这是我的table类,我使用每台计算机作为工作人员来处理传递给它的任务C# 是否可以使用带有SKIP LOCKED命令的数据库优先EF 6?,c#,sql,entity-framework,concurrency,C#,Sql,Entity Framework,Concurrency,我使用SQL表作为作业队列,非常类似于本文: 我的问题是,我使用的是EntityFramework6和DatabaseFirst代码,从我可以看出,EF6不支持skip-locked命令。这是我的table类,我使用每台计算机作为工作人员来处理传递给它的任务 public partial class InProgress { public int ID { get; set; } public string Task { get; set; } public string
public partial class InProgress
{
public int ID { get; set; }
public string Task { get; set; }
public string Computer { get; set; }
public DateTime Date { get; set; }
}
有没有人可以共享任何C代码,这样我就可以确保没有其他计算机可以同时处理与另一台计算机相同的任务
更新:我想澄清的是,我并不是在做一个传统的队列,在这个队列中,你会不断地添加和删除到队列中,或者在本例中是在表中。我有一个包含任务列表的表格,我经常让多台计算机处理任务,当任务完成时,它们会用完成的时间更新日期列。我首先处理日期最早的任务
下面是我根据提供的信息尝试做的一些伪代码
create procedure usp_enqueuePending
@date datetime,
@task varchar(50),
@computer varchar(50)
as
set nocount on;
insert into InProgresses(Date, Task, Computer)
values (@date, @task, @computer);
go
create procedure usp_dequeuePending
as
set nocount on;
declare @now datetime;
set @now = getutcdate();
with cte as (
select top(1)
Task
from InProgresses with (rowlock, updlock, readpast)
where Date < @now
order by Date)
delete from cte
output deleted.Task;
go
using var context = new context();
var dequeuedItem = context.usp_dequeuePending(); // not sure how to convert this back to an InProgress class
// do work here I'm guessing
// add to the queue when finished with it??
context.usp_enqueuePending(DateTime.UtcNow, task, computer);
您可以在EF Core中编写自定义查询,请参阅。所以你可以这样做: dbContext.InProgress .FromSqlRawSELECT*来自model.InProgress与rowlock、updlock、readpast .在哪里…//在这里做其他LINQ的事情
它不是非常漂亮,但目前我不知道有更好的解决方案。SQL Server的锁提示是rowlock、updlock、readpass,您需要一个事务。请参见示例:@DavidBrowne Microsoft我认为您的方法是最好的,但我不确定如何将建议事务的输出转换回InProgress类。对于我上面概述的内容,您有C代码示例吗?我更新了我的问题,加入了更多关于这类事情的信息?等待使用var事务=。。。;var item=await context.InProgress.FromRawSql…其中…OrderBy…FirstOrDefaultAsync。。。;context.InProgress.removietem;wait context.SaveChangesAsync;wait transaction.CommitAsync;//在这里使用该项…您也可以从SQLRAW…中调用该过程,因为您似乎已经拥有了它