SQL傳輸使用非常特定的鎖提示來鎖定一行並導致其他競爭線程忽略當前鎖定的任何行。
從NServiceBus.SqlServer 2.2.0在SQL中使用,但我重新格式化(在我寫這篇文章時的當前版本),是:
WITH message AS
(
SELECT TOP(1) *
FROM [{Schema}].[{Queue}] WITH (UPDLOCK, READPAST, ROWLOCK)
ORDER BY [RowVersion] ASC
)
DELETE FROM message
OUTPUT deleted.Id, deleted.CorrelationId, deleted.ReplyToAddress,
deleted.Recoverable, deleted.Expires, deleted.Headers, deleted.Body;
它採用了Common Table Expression源數據到一個行的限制。返回,然後使用以下鎖提示:
UPDLOCK
- 將數據鎖定在意圖更新它的位置。
READPAST
- 忽略鎖定的行並獲取下一個解鎖的行。
ROWLOCK
- 強制行級鎖定,不會升級到頁面鎖定或表鎖定。
通過執行整個東西作爲刪除,然後輸出要刪除的數據,我們可以讀取數據,如果事務提交,行被刪除。否則,如果事務回滾,則釋放該鎖並等待下一個競爭消費者獲取該行。