Sql-Server

MSSQL:按送出順序自動編號行

  • April 26, 2020

一般設置

我有一個帶有 ID 欄位和一些數據的事件表。多個生產者執行緒應同時向該表插入事件。每批插入都在一個單獨的事務中完成,因為它相對於其他數據應該是原子的。

我也有一些消費者定期從這張表中閱讀。每個消費者都有一個指向此事件表中處理的最後一個 ID 的指針。

面臨的問題

經過一些試驗後identity column,似乎在插入時將 ID 分配給新記錄,而不是在送出時。這意味著我可能會出現這樣的情況:

  • 生產者 A 將事件 EA 插入表中(分配的 ID:1)
  • 生產者 B 將事件 EB 插入表中(分配的 ID:2)
  • 生產者 B 送出
  • 消費者讀取最新事件 EB,並將“最後處理”指針設置為 2
  • 生產者 A 送出
  • 消費者永遠不會處理事件 EA,因為它的 ID 較低,假設已經處理

問題

如何確保事件(數據庫行)按送出順序遞增?如果事務回滾等,我不介意系列中的間隙,但是永遠不應該送出 ID 低於已經送出的項目(因此可能已經處理),當然它們需要獨特。我不想鎖定整個表,因為許多事務並行執行,有些可能會執行一段時間。

我可以使用某種插入觸發器、儲存過程或類似方法來確保這一點,還是在應用程式碼中進行某種後處理更好?

如何確保事件(數據庫行)按送出順序遞增?

你沒有。至少在消除並發作者的情況下不會。您根本不為您的讀者使用高水位標記。閱讀後刪除行,或更新它們以顯示它們已被處理。

參見例如使用表作為隊列

嘗試 sequence 而不是 identity 。在循環中,在使用 nolock 送出 EB 讀取表並檢查之前,如果得到的數字小於 EB,則等待延遲並再次循環

引用自:https://dba.stackexchange.com/questions/265847