[英]how to mark records that are read in mssql
我創建了一個系統,每天通過SMS向我們的客戶發送一些信息。 由於發送SMS的過程可能需要一段時間,這是由多個進程完成的,每個進程都發送有限數量的SMS。 當某個進程讀取大量pohne nuber記錄(比如說其中的1000個)以發送短信時。 我想將這1000條記錄標記為其他進程也不會讀取這些記錄。
Select Top(1000) ID, Number from Phones where isactive = 1 and isverified = 1
我需要一些執行以下操作的代碼:
update Phones, set ReadTime = getdate() where
(上面選擇)
現在我想將這些記錄的ReadTime
列更新為getdate()
,以確保其他調度進程不會再次讀取它們(我設置日期時間標記而不是位標記的原因是某些SMS發送可能會失敗這樣一來,我就可以了解哪些內容是很久以前讀取的,但沒有更新發送時間)
發送短信后標記它們(無論如何都要寫發送時間)將無濟於事,因為將處理發送SMS的計划任務將一次讀取所有1000條記錄,並且可能還有其他進程讀取的記錄但尚未被標記(因為SMS尚未發送)。
您應該能夠執行以下操作:
UPDATE Phones
SET ReadTime = GetDate()
WHERE ID IN (SELECT Top 1000 ID
FROM Phones
WHERE IsActive = 1
AND IsVerified = 1
AND ReadTime Is Null -- you will want to exclude any records already updated
ORDER BY ID)
可能您可以在表中添加一個額外的列,該列包含進程ID的ID。 然后,您可以在每個過程中進行調用:
UPDATE Phones
SET ReadTime = GetDate(),
ProcessId = "Process0001" --or whatever the process ID is
WHERE ID IN (SELECT Top 1000 ID FROM Phones WHERE IsActive = 1 AND IsVerified = 1
AND ProcessId IS NULL AND ReadTime IS NULL)
然后,使用您的進程ID調用所有記錄。 最后,您從表中刪除進程ID。
您可以一次性選擇並輸出行。 這將確保選擇的行與更新的行相同,選擇的答案將失敗。
;with a
as
(
select top 1000 readtime, id, number from @phones
where isactive = 1 and isverified = 1
and readtime is null
)
update a
set Readtime = getdate()
output deleted.ID, deleted.Number
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.