多執行緒下不反覆讀取SQL Server 表的資料

2021-09-07 11:54:08 字數 972 閱讀 9345

在進行一些如傳送簡訊、郵件的業務時,我們常常會使用乙個表來儲存待傳送的資料,由後台多個執行緒不斷的從表中讀取待傳送的資料進行傳送,傳送完畢後再將資料轉移到歷史表中,這樣保證待傳送表的資料普通情況下不會太多。如待傳送表結構為:

create table sms(id int not null identity(1,1),content varchar(1024),status int not null,createtime datetime);

status 取值:0未讀取 1已讀取

這樣設計的優點是,不會由於後端有時傳送過慢導致前端接收傳送訊息的請求出現故障。如傳送簡訊的業務,有時由於運營商的閘道器原因傳送太慢,這樣前端能夠先將使用者的傳送請求所有放在待傳送表中,由後端進行慢慢傳送。

在後端傳送程序一般使用

select top 100 * from sms where status=0;這種sql取出未被讀取的資料。

為了提高後端傳送能力。須要部署多個程序同一時候從待傳送表中取出資料進行傳送,這樣有時就會造成同乙個記錄被多個程序同一時候取出來。並傳送的情況。

今天查了一下sql server 的msdn。發現能夠通過先更新同一時候通過deleted表(就像是在觸發器中使用一樣)取出的方式。來保證每條記錄僅僅會被讀取一次。

declare @rowid table(rowid int);

begin

set rowcount 100; --一次讀取的行數

--先將要讀取的記錄狀態更新

update sms set [status]= 1 output deleted.id into @rowid where [status] = 0;

--讀取剛更新狀態的記錄

select * from sms where id in (select rowid from @rowid);

end

很多其它關注付義方技術部落格:

Request Body可以反覆讀取的方法

org.springframework.web.filter.hiddenhttpmethodfilter 過濾器已經讀取流了,因此想頻繁讀取流的話,自定義filter必須在org.springframework.web.filter.hiddenhttpmethodfilter之前,否則獲取不到資...

python多執行緒讀取檔案

coding utf 8 importos,time import threading rlock threading rlock curposition 0 class reader threading thread def init self res self res res super rea...

Python 多執行緒分塊讀取檔案

什麼也不說,直接上 絕對看的懂 coding utf 8 import time,threading,configparser reader類,繼承threading.thread init 方法初始化 run方法實現了讀檔案的操作 class reader threading.thread def...