微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

是否可以将 Database First EF 6 与 SKIP LOCKED 命令一起使用?

如何解决是否可以将 Database First EF 6 与 SKIP LOCKED 命令一起使用?

我使用 sql 表作为作业队列,这与此处的文章非常相似:https://vladmihalcea.com/database-job-queue-skip-locked/

我的问题是我将 Entity Framework 6 与 Database First 代码一起使用,据我所知,EF6 不支持跳过锁定命令。这是我的表类,我将每台计算机用作工作人员来处理我传递给它的任务。

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 中编写自定义查询,请参阅 here。所以你可以做这样的事情:

dbContext.InProgress
  .FromSqlRaw("SELECT * FROM model.InProgress WITH (rowlock,updlock,readpast)")
  .Where(...) // do other LINQ stuff here

它不是非常漂亮,但我目前不知道更好的解决方案。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。