Sql-Server
MSSQL:按送出順序自動編號行
一般設置
我有一個帶有 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,則等待延遲並再次循環