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