sql-server - 扩展读取队列表的实体框架项目
问题描述
我有一个使用 Entity Framework 6.1 的 Windows 服务,它从 Queue 表中读取数据。我抓取状态为Pending的最旧记录,然后将状态更改为InProcess,完成后将状态更改为Complete。
我需要允许缩放。我将有许多这样的 Windows 服务处理队列表。一个实例有可能会在另一个实例获取最旧的记录之后,但在将其设置为InProcess之前获取它。在这种情况下,他们都将在同一条记录上工作。
我想我可以通过行锁定来做到这一点,但 EF 不支持。
知道如何做到这一点吗?
解决方案
我会从 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
推荐阅读
- python - 带有 psycopg2 和 pgAdmin4 的 Python 如何检索 bytea 数据
- javascript - 使用 simpleXLSX 解析 Excel 表数据并在 PHP 中显示一些特定的列
- python - python gzip base64 从 mathcad 二进制内容中提取数据
- node.js - 在 Express js/Node 中使用 multer 访问表单数据
- http - 管理“HTTP/1.1 502 Bad gateway error”
- css - 现在不推荐使用 colgroup col width 属性的任何替代方法吗?
- bash - 在命令行中为批处理脚本添加参数
- php - 将“查看购物车”更改为“转到购物车”(Woocommerce)
- reactjs - Azure 媒体播放器事件现在适用于 React 组件
- java - 给定购物车和产品,我如何为在线商店编写 JPA 关系